识别浮点数的实际精度

Identify actual precision of a float

提问人:Zak Stucke 提问时间:3/15/2018 最后编辑:ndmeiriZak Stucke 更新时间:7/18/2018 访问量:139

问:

我正在与返回浮点数的 API 进行交互。我正在尝试计算 API 创建这些浮点数的小数位数。

例如:

# API returns the following floats.
>> 0.0194360600000000015297185740.....
>> 0.0193793800000000016048318230.....
>> 0.0193793699999999999294963970.....

# Quite clearly these are supposed to represent:
>> 0.01943606
>> 0.01937938
>> 0.01937937

# And are therefore ACTUALLY accurate to only 8 decimal places. 

如何识别浮点数实际上精确到小数点后 8 位?完成此操作后,我可以使用“true”值而不是不准确的浮点数初始化实例。decimal.Decimal

编辑:API 返回的准确小数位数各不相同,并不总是 8 位!

Python 十进制 浮点精度

评论

0赞 Xantium 3/15/2018
round()到小数点后 8 位?
1赞 Zak Stucke 3/15/2018
重点是我不知道浮点响应的实际精度,我需要某种方法来计算它首先是小数点后 8 位(或任何其他精度)。谢谢
0赞 Jongware 3/15/2018
是否可以在该 API 中输入无理数或重复数?这些示例也都以 0(实际上是“0.0”)作为它们的第一位数字——会一直如此吗?
1赞 Matteo Italia 3/15/2018
这里通常的方法(Python 使用)是使用最小位数进行打印,再次解析后,将返回完全相同的值。这通常会产生合理的结果,但请记住,没有“真正”的方法来找出“API 的真正含义”——它实际上可能意味着 0.01943606 或 0.01943606000000000015297185740,你无法知道,因为它们实际上是相同的值。reprfloatfloat
0赞 Zak Stucke 3/15/2018
usr2564301 我不这么认为,很确定一切都四舍五入到一定数量的小数位。

答:

6赞 ndmeiri 3/15/2018 #1

如果您使用的是 Python 2.7 或 Python 3.1+,请考虑使用内置的。repr()

以下是它在 Python 3.6 解释器中与示例配合使用的方式。

>>> repr(0.0194360600000000015297185740)
'0.01943606'
>>> repr(0.0193793800000000016048318230)
'0.01937938'
>>> repr(0.0193793699999999999294963970)
'0.01937937'

这之所以有效,是因为显示了仍然满足 的数字 的最小精度。repr()nfloat(repr(n)) == n

给定 返回的字符串表示形式,可以计算小数点右侧的位数。repr()

评论

1赞 Zak Stucke 3/15/2018
谢谢我不知道 repr 的存在,这对我来说真的很有用。:)