Haskell中Double类型输出行为异常:与Python结果不一致
GHC REPL中Double类型0.1的printf输出为何与Python不同?
核心原因是GHC的printf和Python的字符串格式化采用了不同的浮点数输出策略,但底层存储的IEEE 754双精度浮点数是完全一致的。
首先明确:0.1无法被IEEE 754双精度浮点数精确表示,实际存储的二进制值对应的十进制是0.1000000000000000055511151231257827021181583404541015625,这个值在两种语言中是完全相同的。
差异来自输出逻辑:
- Python的格式化逻辑:会输出浮点数对应的完整十进制精确表示,所以会把存储值的所有尾数都展示出来,因此你看到了末尾的
555。 - GHC的
printf逻辑:遵循「最短十进制表示」规则——它会选择最短的十进制数,使得将该十进制数转换回IEEE 754双精度浮点数时,得到的是原始存储值。对于0.1来说,0.1本身就是满足这个条件的最短表示,因此当指定%.20f时,它会用零填充到20位小数,但不会显示后面的非零尾数(因为0.1和实际存储值在双精度下是等价的)。
如果在GHC中提高输出精度,就能看到完整的尾数:
ghci> printf "%.50f\n" (0.1 :: Double) 0.10000000000000000555111512312578270211815834045410
内容的提问来源于stack exchange,提问作者Sibi
相关产品推荐
相关产品推荐

