我们正在Javascript中构建一个表,其中Handsontable表示货币金额。我们为用户提供了使用两位小数或无小数位来呈现金额的可能性(这是客户的要求)。然后我们发现这样的事情:
Column A Column B Column C = A + B
-------------------------------------------
-273.50 273.50 0 Two decimals
-273 274 0 No decimals
稍微研究一下,我们发现Javascript中的基本舍入函数,Math.round()
,works like this:
如果小数部分恰好为0.5,则参数将四舍五入为+∞方向的下一个整数。 请注意,这与许多语言的
round()
函数不同,这些函数通常将此情况舍入到下一个远离零的整数,而不是(在此处给出不同的结果负数的情况,其中小数部分恰好为0.5)。
由于我们正在处理货币金额,因此我们不关心小数点后第二位后发生的情况,因此我们选择将-0.0000001添加到表中的任何负值。因此,当渲染具有两个或没有小数的值时,现在我们得到了正确的结果,因为Math.round(-273.5000001)
= -274,而Math.round(-273.4900001)
仍然是-273。
尽管如此,我们希望找到一个更好的解决方案来解决这个问题。那么实现这一目标的最佳,最优雅的方法是什么(不需要修改原始数值)?请注意,我们不直接调用Math.round(x)
,我们只是告诉Handsontable格式化具有给定小数位数的值。
答案 0 :(得分:-1)
正如@dandavis在评论中指出的那样,处理此问题的最佳方法是使用.toFixed(2)
代替Math.round()
。
Math.round()
向上舍入了一半。
.toFixed()
将从零开始一半。我们在那里指定2
来表示在进行舍入时使用的小数位数。