我有以下JavaScript语法:

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

这四舍五入为整数.我怎样才能返回小数点后两位的结果呢?

推荐答案

NOTE - See Edit 4 if 3 digit precision is important

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

Edit-如其他人所述,这会将结果转换为字符串.为了避免这种情况:

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

正如 comments 中提到的,此函数在一定精度上失败,例如,在1.005的情况下,它将返回1.00%而不是1.01%.如果准确度到这个程度很重要,我找到了这个答案:https://stackoverflow.com/a/32605063/1726511,这似乎与我try 过的所有测试都很好.

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

Edit 3-在实际返回上修复to值似乎仍然搞错了一些数字,这个最后的编辑似乎起作用了.哎呀,这么多返工啊!

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/

Edit 4-你们真是要了我的命.Edit3在负数上失败,没有深入研究为什么在进行舍入之前将负数变为正数,然后在返回结果之前将其反转更容易.

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/

Javascript相关问答推荐

RxJS setTimeout操作符等效

React:未调用useState变量在调试器的事件处理程序中不可用

Vue:ref不会创建react 性属性

在贝塞尔曲线的直线上找不到交叉点:(使用@Pomax的bezier.js)

TypScript界面中的Infer React子props

将自定义排序应用于角形数字数组

如何根据当前打开的BottomTab Screeb动态加载React组件?

JSDoc创建并从另一个文件导入类型

Prisma具有至少一个值的多对多关系

我怎么才能得到Kotlin的密文?

覆盖加载器页面避免对页面上的元素进行操作

使用auth.js保护API路由的Next.JS,FETCH()不起作用

expo 联系人:如果联系人的状态被拒绝,则请求访问联系人的权限

如何使用抽屉屏幕及其子屏幕/组件的上下文?

MongoDB通过数字或字符串过滤列表

在点击链接后重定向至url之前暂停

无法向甜甜圈图表上的ChartJSImage添加可见标签

REACT-本机错误:错误类型错误:无法读取未定义的容器的属性

使用VITE开发服务器处理错误

使用onClick单击子元素时,使用交点观察器的关键帧动画意外运行