在此 API ( https://docs.gemini.com/rest-api/#current-order-book ) 中,它表示:
The quantities and prices returned are returned as strings rather than numbers. The numbers returned are exact, not rounded, and it can be dangerous to treat them as floating point numbers.
为什么将数字字符串视为 float 会“危险”?仅仅是精度的损失吗?如果是精度损失,从技术上讲,首先返回 float 会更加“危险”。这句话似乎暗示解析 float 的行为可能是“危险的”。为什么会这样?
最佳答案
What are the risks of parsing numeric strings into floats?
将无限映射到有限
常见的浮点类型具有有限的成员集/大小。假设float
占用了32位。这会产生大约 232 个不同的float
值。 字符串有无限的组合。无论目标 float
是使用二进制、十进制还是 stone knives and bears skins 1:40 进行编码,都必须付出一些代价。 .
风险:假设所有值都是可编码的。
十进制转二进制
典型floats使用二进制表示法/分数,而字符串通常使用十进制数字编写。
"1.234"
没有与 float
等值的精确值。相反,解析会产生附近的浮点
。 float
本身是精确,但与 1.234 的精确值不同。
风险:假设转换完全相同。
范围
即使不精确是可以容忍的,float
也有一个范围,可能是 +/-1038、+/-10308 等。 10000!预计不会具有代表性。
在转换为 0.0 之前,值也只能变得很小。
风险:上溢/下溢。
真正的危险是缺乏对浮点在各种情况下与真实数学的不同以及如何应对的理解。有了这些,微妙之处可能会导致无限循环、金钱损失、代码崩溃或跨平台不一致。
在数学中,有real number_line 。对于float
,线条是“点状”的。 Zoomed in example example 2
关于parsing - 将数字字符串解析为 float 有哪些风险?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54978633/