PowerShell Midpoint Rounding 舍入异常问题咨询
PowerShell Midpoint Rounding 舍入异常问题咨询
我太懂你这种困惑了——明明都是结构类似的数值,为什么唯独19.025的中点舍入结果跟预期不一样?别慌,这其实是二进制浮点数的精度限制在作祟,不是PowerShell的舍入逻辑出了问题。
给你拆解下背后的核心原因:
- 我们日常用的十进制小数(比如0.025),很多在二进制浮点数体系里是无法精确存储的,只能保存一个近似值。
- 就拿
19.025来说,它在二进制浮点数中实际存储的数值是略小于19.025的(大概是19.024999999999998...);而像11.025、12.025这类数值,存储的近似值刚好是略大于原始值的。 - 中点舍入(MidpointRounding)的逻辑是:只有当数值刚好处于两个舍入目标的正中间,或者实际值略大于中间值时,才会向上舍入。如果实际存储的数值略小于19.025,那它离19.02更近,自然就向下舍入成19.02了。
如果想避开这个问题,建议改用[decimal]类型处理这类数值,因为Decimal是基于十进制的浮点类型,能精确表示像0.025这样的十进制小数。举个实际的代码例子:
[Math]::Round([decimal]19.025, 2, [MidpointRounding]::AwayFromZero)
运行这个命令,就能得到你预期的19.03了。
备注:内容来源于stack exchange,提问作者Gabe Stotler
相关产品推荐
相关产品推荐

