为何zsh中$((0.1))会展开为0.10000000000000001?
为什么zsh中
$((0.1))会展开为0.10000000000000001? 嘿,这个现象本质上要从浮点数的二进制存储特性和不同工具的输出策略差异说起:
核心原因:二进制浮点数无法精确表示0.1
十进制的0.1转换成二进制是一个无限循环的小数(类似十进制里的1/3=0.333...),计算机只能用一个近似的二进制值来存储它。这个近似值对应的十进制数就是0.10000000000000001——这不是zsh的问题,而是所有基于IEEE 754标准存储浮点数的系统都会存在的精度限制。
zsh与其他工具的差异点
不同工具对这个近似值的输出格式化逻辑不一样:
- zsh的算术展开
$((...))会直接输出浮点数存储的原始近似值的完整十进制表示,没有做舍入处理,所以你看到了那个长长的尾数。 - 而像awk、ksh等工具,在输出浮点数时会默认做舍入处理,把这个极小的误差隐藏起来,显示成我们直觉里的
0.1——毕竟这个误差在绝大多数场景下都可以忽略不计。
如何让zsh输出更友好的格式?
如果想让zsh显示出0.1,可以用printf来手动控制输出精度:
printf "%.1f\n" $((0.1)) # 输出:0.1
内容的提问来源于stack exchange,提问作者Stéphane Chazelas
相关产品推荐
相关产品推荐

