将数字字符串解析为浮点数有什么风险?

时间:2019-03-04 07:41:37

标签: parsing floating-point

在此API(https://docs.gemini.com/rest-api/#current-order-book)中,它表示:

  

返回的数量和价格以字符串而不是字符串形式返回   数字。返回的数字是准确的,不是四舍五入的,它可以是   将它们视为浮点数很危险。

为什么将数字字符串视为浮点数是“危险的”?仅仅是准确性的损失吗?如果损失精度,从技术上讲,首先返回浮标更“危险”。这句话似乎暗示着解析浮点数的行为可能是“危险的”。为什么会这样呢?

1 个答案:

答案 0 :(得分:1)

  

将数字字符串解析为浮点数有什么风险?

将无限映射为无限

常见的浮点类型具有有限的成员集/大小。假设float占用了32位。这导致大约2 32 个不同的float值。 字符串具有无限的组合。无论目标float是使用二进制,十进制还是stone knives and bears skins 1:40进行编码,都必须付出一些努力。

风险:假设所有值都是可编码的。

十进制转换为二进制

典型的floats使用 binary 表示法/分数,而 string 通常使用十进制数字书写。

"1.234"没有与float等效的精确值。相反,解析会产生附近的floatfloat本身是 exact ,但与1.234的 exact 值不同。

风险:假设转化次数完全相同。

范围

即使可以容忍不精确,float的范围也可能是+/- 10 38 ,+ /-10 308 等。 10000!并非专家代表。

在将其转换为0.0之前,值也只能变得如此之小。

风险:上溢/下溢。


真正的危险缺乏对浮点在各种情况下与 real 数学如何不同以及如何应对的理解。有了这些,细微之处就可能导致无限循环,金钱损失,代码崩溃或跨平台不一致。

数学中有real number_line。使用float,该行被“点缀”。 Zoomed in example example 2