答案 0 :(得分:1)
这是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
时,它会四舍五入为较小的有效十进制数字。
这就是为什么会计和簿记软件从不使用浮点数,而只能使用整数和十进制的原因。
答案 1 :(得分:0)
作为一种从JSON到打字稿反序列化的解决方法,以下工作有效:
a_real_32.out.to_real_64