在 Javascript 中从零舍入

Cha*_*lie 7 javascript math rounding handsontable

我们正在用 Javascript 构建一个表格,其中 Handsontable 表示货币金额。我们为用户提供了以两位小数或不带小数位的方式呈现金额的可能性(这是客户的要求)。然后我们发现这样的事情:

Column A     Column B      Column C = A + B
-------------------------------------------
-273.50       273.50       0                 Two decimals
-273          274          0                 No decimals
Run Code Online (Sandbox Code Playgroud)

调查一点,我们来到地发现,在JavaScript中的基本功能四舍五入,Math.round()是这样工作的

如果小数部分正好是 0.5,则参数将四舍五入到 +? 方向上的下一个整数。注意,这不同于许多语言round()功能,这往往圆这种情况下为下一个整数远离零,而不是(在负数的情况下给予不同的结果与正好0.5的小数部分)。

当我们处理货币金额时,我们不关心小数点后第二位会发生什么,因此我们选择将 -0.0000001 添加到表中的任何负值。因此,当渲染带有两位小数或不带小数的值时,现在我们得到了正确的结果,如Math.round(-273.5000001)= -274,并且Math.round(-273.4900001)仍然是 -273。

尽管如此,我们希望找到一个更好的解决方案来解决这个问题。那么实现这一目标的最好、最优雅的方法是什么(不需要修改原始数值)?请注意,我们不直接调用Math.round(x),我们只是告诉 Handsontable 用给定的小数位数格式化一个值。

Ken*_*mon -3

正如 @dandavis 在评论中指出的那样,处理此问题的最佳方法是使用.toFixed(2)而不是Math.round().

Math.round()正如您所指出的,四舍五入到一半。

.toFixed()将从零舍入一半。我们2在那里指定 来指示进行舍入时要使用的小数位数。

  • 我认为这是误导。`.toFixed()` 不会从零舍入一半。它会截断小数位。`(1.237).toFixed(2); // "1.23"` 当你可能期望 1.24 时 (4认同)
  • 它绝对远离 0,但其行为与 C# 不同。剪切后剩余的绝对值在 JS 中必须 >5,而在 C# 中必须 >= 5。 `decimal.Round(1.255m, 2, MidpointRounding.AwayFromZero)` // C# = 1.26 `(1.255).toFixed( 2)` //JS = 1.25 (2认同)