Eiffel:REAL_32.to_double 给出了一个奇怪的值
Eiffel: REAL_32.to_double gives a strange value
尝试将 real_32 转换为 real_64,我得到
real_32: 61.55
real_64: 61.54999923706055
我对 to_double
函数有误吗?
这是expected。在具体的例子中,十进制61.55的单精度和双精度的二进制表示分别是:
REAL_32: 0 10000100 11101100011001100110011
REAL_64: 0 10000000100 1110110001100110011001100110011001100110011001100110
如您所见,尾随模式 0011
是反复出现的,应该 无穷大 以给出精确值。
当 REAL_32
分配给 REAL_64
时,不会自动添加尾随 0011
,而是用零填充:
REAL_32: 0 10000100 11101100011001100110011
REAL_64: 0 10000000100 1110110001100110011001100000000000000000000000000000
在十进制表示法中,这对应于 61.54999923706055
。这里重要的是,61.54999923706055
和 61.55
在使用单精度浮点数时具有完全相同的二进制表示形式。您可以使用 print ({REAL_32} 61.55 = {REAL_32} 61.54999923706055)
自行查看。也就是说,你得到的结果是正确的,两个值是一样的。唯一的区别是当打印 REAL_32
时,它被四舍五入到有意义的小数位数。
这就是会计记账软件从不使用浮点数,只使用整数和小数的原因。
作为从 JSON 进入 typescript 反序列化的 解决方法,以下方法有效:
a_real_32.out.to_real_64
尝试将 real_32 转换为 real_64,我得到
real_32: 61.55
real_64: 61.54999923706055
我对 to_double
函数有误吗?
这是expected。在具体的例子中,十进制61.55的单精度和双精度的二进制表示分别是:
REAL_32: 0 10000100 11101100011001100110011
REAL_64: 0 10000000100 1110110001100110011001100110011001100110011001100110
如您所见,尾随模式 0011
是反复出现的,应该 无穷大 以给出精确值。
当 REAL_32
分配给 REAL_64
时,不会自动添加尾随 0011
,而是用零填充:
REAL_32: 0 10000100 11101100011001100110011
REAL_64: 0 10000000100 1110110001100110011001100000000000000000000000000000
在十进制表示法中,这对应于 61.54999923706055
。这里重要的是,61.54999923706055
和 61.55
在使用单精度浮点数时具有完全相同的二进制表示形式。您可以使用 print ({REAL_32} 61.55 = {REAL_32} 61.54999923706055)
自行查看。也就是说,你得到的结果是正确的,两个值是一样的。唯一的区别是当打印 REAL_32
时,它被四舍五入到有意义的小数位数。
这就是会计记账软件从不使用浮点数,只使用整数和小数的原因。
作为从 JSON 进入 typescript 反序列化的 解决方法,以下方法有效:
a_real_32.out.to_real_64