当前位置: 首页 > 知识库问答 >
问题:

javascript - JS前端数字计算精度丢失问题,请问各位是怎么解决的?

齐宗清
2023-07-09

比如计算百分比,乘除法,js计算有小数点,精度会丢失,通过toFixed可以截取小数后几位,但是会四舍五入,而toPrecision则需要指定数字长度。现在要保留小数点后2位,请问怎么处理

let n = 123.123;
console.log(n.toPrecision(4)) // 123.1
let n = 123.126;
console.log(n.toFixed(2)) // 123.13

期望结果:
let n = 123.1266646635525563;
// 123.12

共有4个答案

蓬祺
2023-07-09
// 示例:使用 Bigint 进行计算
const num1 = BigInt(0.1 * 10);
const num2 = BigInt(0.2 * 10);

const result = (num1 + num2) / BigInt(10);
console.log(result.toString()); // 输出: 0.3
萧安怡
2023-07-09

类似的方法,函数其实很多,比如说可以用Math.floor函数,将结果向下取整,最后再除以100。这样可以保留小数点后2位并且不进行四舍五入。
可以这样:

let n = 123.1266646635525563;
let result = Math.floor(n * 100) / 100;
console.log(result); // 123.12

或者用字符串的substring函数截取小数点后的位数也是可以的,相对刚刚纯数字的方法多了一个转换步骤,相对复杂一点点,但有时候用得上,将len n转换为s字符串,然后在里面找到小数点的位置,最后再输出。

let n = 123.1266646635525563;
let result = n.toString();
let decimalIndex = result.indexOf('.') + 1;
result = result.substring(0, decimalIndex + 2);
console.log(parseFloat(result)); // 123.12
锺高翰
2023-07-09

可以考虑先乘以100再整数取整,最后除以100恢复到原数字

Math.floor(n * 100) / 100

柯星华
2023-07-09

所谓“没有完美的算法,只有合适的场景”,浮点数字(小数)就是个很好的例子。

我们知道,按照目前的规范,JS 无法直接完美的处理小数。但是实际上,我们往往也不需要它“完美”处理小数。比如,以记账为例,我们通常只关心小数点后两位,也就是“分”,再细的,我们关注它意义不大,投入产出比太低。那么我们就可以把所有数字 * 100,取整后保存,带来的误差非常低。

所以,讨论小数精度问题,要看具体的需求。只要满足需求,怎么保存都可以。

 类似资料:
  • 本文向大家介绍js如何解决数字精度丢失的问题?相关面试题,主要包含被问及js如何解决数字精度丢失的问题?时的应答技巧和注意事项,需要的朋友参考一下 const verifyFunc = (left, right) => { return Math.abs(left - right) < Number.EPSILON * Math.pow(2, 2); }; console.log(verifyFu

  • 通过print-js打印出来的小票是乱码的,貌似是字符编码的问题,网上找过很多方案,基本上都是说字符编码格式的问题,或者直接用electron来实现的,请问大家对于前端热敏纸小票打印都是用的什么解决方案?

  • markdown图片可以传到本地文件夹但只能传jpg,png传不了,数据库也有路径,但是不渲染出来 头像上传七牛云,密钥和域名都写得对的但点击就报400

  • ​https://github.com/camsong/blog/issues/9​

  • 目前用的是harmonyOS4.0版本,遇到了panel的高度问题,点击panel外的区域也会拖动panel的大小,需求是拖动panel外的区域不会影响panel,而是正常的页面滑动(类似一些著名听书软件的功能),一直没有一个完美的解决方案,期待大佬解惑 尝试过onChange或onHeight事件 高度随mode改变而改变,结果是失败的