资讯专栏INFORMATION COLUMN

关于 JavaScript 浮点运算的精度解决方案

jsyzchen / 3254人阅读

摘要:原因至于问题产生的原因,或者关于问题的更详细的描述,大家请看下面几个文章浮点运算浮点值运算舍入误差基础浮点数四则运算精度丢失问题解决方案这里主要讨论一下解决方案的问题,上面几篇文章的解决思路,都是重写加法减法乘法和除法运算。

问题背景

在 chrome 浏览器中调出开发者工具,在控制台窗口输入下面的表达式:

0.1 + 0.2            // 期望:0.3,结果:0.30000000000000004

这就是 JavaScript 臭名昭著的浮点值运算舍入误差问题。

原因

至于问题产生的原因,或者关于问题的更详细的描述,大家请看下面几个文章:

JavaScript浮点运算0.2+0.1 !== 0.3

javascript浮点值运算舍入误差

【JS 基础】JS 浮点数四则运算精度丢失问题 (3)

解决方案

这里主要讨论一下解决方案的问题,上面几篇文章的解决思路,都是重写:加法、减法、乘法和除法运算。感觉过于啰嗦,方案不简洁。简单的办法就是,加、减、乘、除,该怎么算还怎么算。因为结果有问题,所以就在结果上做文章。解决问题的思路,其实就是考虑在计算结果上保留几位小数的问题。

代码如下:

/**
 * 小数点后面保留第 n 位
 *
 * @param x 做近似处理的数
 * @param n 小数点后第 n 位
 * @returns 近似处理后的数 
 */
function roundFractional(x, n) {
  return Math.round(x * Math.pow(10, n)) / Math.pow(10, n);
}

有了这个函数,那么加、减、乘、除的计算就变成下面的形式了:

roundFractional(0.1 + 0.2, 1);         // 结果:0.3
roundFractional(0.1 * 0.2, 2);         // 结果:0.02
                                       // 减法和除法依次类推,此处略掉两行

可以把下面的代码复制到 chrome 开发者工具的控制台中,观察一下运行效果:

function roundFractional(x, n) {
  return Math.round(x * Math.pow(10, n)) / Math.pow(10, n);
}
console.log(0.1 + 0.2);
console.log(roundFractional(0.1 + 0.2, 1));
console.log(0.1 * 0.2);
console.log(roundFractional(0.1 * 0.2, 2));

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/92987.html

相关文章

  • JavaScript数据精度缺失问题

    摘要:说到数据精度缺失的问题,就想起今年夏天刚转正做的一个项目。但是和用二进制表示的话位数是无法穷尽的。因此我们看到的用二进制表示的某数只是真实的的一个近似数。这是一个挺好用的数据运算工具,它也是为了解决数据精度缺失而产生的。 说到数据精度缺失的问题,就想起今年夏天刚转正做的一个项目。当时的需求涉及到金额的计算,那时候对js的了解比现在还少,不过当时关于金额计算这块js函数的封装是项目里架构...

    苏丹 评论0 收藏0
  • [ JS 基础 ] JS 浮点数四则运算精度丢失问题 (3)

    摘要:基于这个问题运动基础问题,我想应该也有一部分人没有认真对待过中浮点数的四则运算出现的问题。解决方案引自解决方案为了解决浮点数运算不准确的问题,在运算前我们把参加运算的数先升级的的次方到整数,等运算完后再降级的的次方。 基于这个问题:javascript运动基础问题 ,我想应该也有一部分人没有认真对待过js中浮点数的四则运算出现的问题。 1.问题描述 示例代码: var x ...

    hoohack 评论0 收藏0
  • JavaScript浮点运算0.2+0.1 !== 0.3

    摘要:标准二进制浮点数算法就是一个对实数进行计算机编码的标准。然后把取出的整数部分按顺序排列起来,先取的整数作为二进制小数的高位有效位,后取的整数作为低位有效位。 浮点运算JavaScript 本文主要讨论JavaScript的浮点运算,主要包括 JavaScript number基本类型 二进制表示十进制 浮点数的精度 number 数字类型 在JavaScript中,数字只有numb...

    iflove 评论0 收藏0
  • JS中如何理解浮点数?

    摘要:本文通过介绍的二进制存储标准来理解浮点数运算精度问题,和理解对象的等属性值是如何取值的,最后介绍了一些常用的浮点数精度运算解决方案。浮点数精度运算解决方案关于浮点数运算精度丢失的问题,不同场景可以有不同的解决方案。 本文由云+社区发表 相信大家在平常的 JavaScript 开发中,都有遇到过浮点数运算精度误差的问题,比如 console.log(0.1+0.2===0.3)// fa...

    bang590 评论0 收藏0
  • Java 中类型、值和变量 之 基本类型

    摘要:在中存在两种类型基本类型和引用类型。值得注意的是,基本类型的值的状态不会被共享。浮点类型和它们的值中的浮点类型遵循标准的定义。布尔类型和它们的值类型表示两个逻辑量,和。 众所周知,Java是一门静态类型的语言,这意味着所有的变量和表达式的类型会在编译时确定。同时,Java 还是一门强类型的语言,因此变量的值或表达式的结果的类型都会受到限制(比如一个声明为 String 的变量不的值不可...

    beita 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<