JavaScript 数学,四舍五入到小数点后两位

新手上路,请多包涵

我有以下 JavaScript 语法:

var discount = Math.round(100 - (price / listprice) * 100);

这四舍五入为整数。如何返回两位小数的结果?

原文由 Smudger 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 809
2 个回答

注意 - 如果 3 位精度很重要,请参阅编辑 4

 var discount = (price / listprice).toFixed(2);

toFixed 将根据超过 2 位小数的值向上或向下舍入。

示例:http: //jsfiddle.net/calder12/tv9HY/

文档: https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed

编辑- 正如其他人所提到的,这会将结果转换为字符串。为了避免这种情况:

 var discount = +((price / listprice).toFixed(2));

编辑 2 - 正如评论中还提到的,此函数在某些精度上失败,例如,在 1.005 的情况下,它将返回 1.00 而不是 1.01。如果这种程度的准确性很重要,我找到了这个答案: https ://stackoverflow.com/a/32605063/1726511 这似乎适用于我尝试过的所有测试。

虽然需要进行一个小的修改,上面链接的答案中的函数在四舍五入时会返回整数,因此例如 99.004 将返回 99 而不是 99.00,这不适合显示价格。

编辑 3 - 似乎在实际返回时 toFixed 仍然搞砸了一些数字,这个最终编辑似乎有效。哎呀,这么多返工!

 var discount = roundTo((price / listprice), 2);

 function roundTo(n, digits) {
 if (digits === undefined) {
 digits = 0;
 }

 var multiplicator = Math.pow(10, digits);
 n = parseFloat((n * multiplicator).toFixed(11));
 var test =(Math.round(n) / multiplicator);
 return +(test.toFixed(digits));
 }

请参阅此处的小提琴示例: https ://jsfiddle.net/calder12/3Lbhfy5s/

编辑 4 - 你们要杀了我。编辑 3 在负数上失败,没有深入研究为什么在进行舍入之前将负数变为正数更容易,然后在返回结果之前将其返回。

 function roundTo(n, digits) {
 var negative = false;
 if (digits === undefined) {
 digits = 0;
 }
 if (n < 0) {
 negative = true;
 n = n * -1;
 }
 var multiplicator = Math.pow(10, digits);
 n = parseFloat((n * multiplicator).toFixed(11));
 n = (Math.round(n) / multiplicator).toFixed(digits);
 if (negative) {
 n = (n * -1).toFixed(digits);
 }
 return n;
 }

小提琴: https ://jsfiddle.net/3Lbhfy5s/79/

原文由 Rick Calder 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果您使用一元加号将字符串转换为数字 ,如 MDN 中所述。

例如: +discount.toFixed(2)

原文由 John Gietzen 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏