parsing - 将数字字符串解析为 float 有哪些风险?

标签 parsing floating-point

在此 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/

相关文章:

perl - 在 Perl 中优雅地解析刚性数据

c - 为 SIGFPE 设置标志并忽略 FPE 继续执行

c++ - 如何在保持显示位数的同时向左移动小数点?

c++ - 从文本文件中读取变量

iOS JSON 解析返回 null

检查 double 的条件是一个整数不起作用

c - 通过快速浮点倒数高效计算 2**64/除数

c - float 据类型不确定

python - 如何用 Python 编写抽象语法树的访问者模式?

将幻灯片解析为每张幻灯片一张图片