美文网首页
JS中浮点数运算后的精度问题

JS中浮点数运算后的精度问题

作者: zhao_ran | 来源:发表于2020-09-18 18:02 被阅读0次

做项目的时候,涉及到商品价格的计算,经常会出现计算出现精度问题。刚开始草草了事,直接用toFixed就解决了问题,并没有好好的思考一下这个问题。后来慢慢的,问题越来越多,连toFixed也出现了(允悲),后来经过搜索网上的各种博客和论坛,整理总结了一下。

浮点数运算后的精度问题

在计算商品价格加减乘除时,偶尔会出现精度问题,一些常见的例子如下:

// 加法 =====================
0.1 + 0.2 = 0.30000000000000004
0.7 + 0.1 = 0.7999999999999999
0.2 + 0.4 = 0.6000000000000001

// 减法 =====================
1.5 - 1.2 = 0.30000000000000004
0.3 - 0.2 = 0.09999999999999998
 
// 乘法 =====================
19.9 * 100 = 1989.9999999999998
0.8 * 3 = 2.4000000000000004
35.41 * 100 = 3540.9999999999995

// 除法 =====================
0.3 / 0.1 = 2.9999999999999996
0.69 / 10 = 0.06899999999999999

toFixed奇葩问题

在遇到浮点数运算后出现的精度问题时,刚开始我是使用toFixed(2)来解决的,因为在W3school和菜鸟教程(他们均表示这锅不背)上明确写着定义:toFixed()方法可把Number四舍五入为指定小数位数的数字。

解决方法

针对以上问题,网上搜了一波解决方法,来看一下。

加法

// 加法
export function accAdd(arg1 = '', arg2 = '') {
    var r1, r2, m
    try { r1 = (arg1).toString().split('.')[1].length } catch (e) { r1 = 0 }
    try { r2 = (arg2).toString().split('.')[1].length } catch (e) { r2 = 0 }
    m = Math.pow(10, Math.max(r1, r2))
    return (arg1 * m + arg2 * m) / m
}

减法

// 减法
export function Subtr(arg1 = '', arg2 = '') {
    var r1, r2, m, n
    try { r1 = (arg1).toString().split('.')[1].length } catch (e) { r1 = 0 }
    try { r2 = (arg2).toString().split('.')[1].length } catch (e) { r2 = 0 }
    m = Math.pow(10, Math.max(r1, r2))
    n = (r1 >= r2) ? r1 : r2
    return ((arg1 * m - arg2 * m) / m).toFixed(n)
}

乘法

// 乘法
export function accMul(arg1 = '', arg2 = '') {
    var m = 0; var s1 = (arg1).toString(); var s2 = (arg2).toString()
    try { m += s1.split('.')[1].length } catch (e) { }
    try { m += s2.split('.')[1].length } catch (e) { }
    return Number(s1.replace('.', '')) * Number(s2.replace('.', '')) / Math.pow(10, m)
}

除法

// 除法
export function accDiv(arg1 = '', arg2 = '') {
    var t1 = 0; var t2 = 0; var r1; var r2
    try { t1 = (arg1).toString().split('.')[1].length } catch (e) { }
    try { t2 = (arg2).toString().split('.')[1].length } catch (e) { }
    // with (Math) {
    r1 = Number((arg1).toString().replace('.', ''))
    r2 = Number((arg2).toString().replace('.', ''))
    return accMul((r1 / r2), Math.pow(10, t2 - t1))
    // }
}

总结

经过测试,可解决计算精度问题,如有不对的地方,欢迎指出。

相关文章

  • JS中浮点数运算后的精度问题

    做项目的时候,涉及到商品价格的计算,经常会出现计算出现精度问题。刚开始草草了事,直接用toFixed就解决了问题,...

  • iOS开发浮点数计算精度问题

    1、浮点数运算带来的问题 在日常工作中涉及到浮点数(float、double)的运算 2、浮点数运算精度的解决方案...

  • javaScript-02

    运算符 算数运算符 概念:算术运算使用的符号,用于执行两个变量或值的算术运算。 浮点数的精度问题浮点数值的最高精度...

  • js 处理四则运算失去精度问题

    js 处理四则运算失去精度问题 计算精度,特别是浮点数计算。举个栗子 然后我寻求各种解决办法,其中用了lodash...

  • 浮点数计算中的精度丢失

    1 js浮点数运算精度丢失 如果你用过js计算浮点数你肯定会遇到过下面这种情况:(我的小学白读了吗==。) (其...

  • 撩课-Web大前端每天5道面试题-Day16

    1.for循环中的作用域问题? 2.重绘和回流? 3.原型及原型链? 4.js浮点数运算精度问题(0.1+0.2!...

  • 撩课-Web大前端每天5道面试题-Day13

    1.for循环中的作用域问题? 2.重绘和回流? 3.原型及原型链? 4.js浮点数运算精度问题(0.1+0.2!...

  • js浮点运算

    前言 在项目开发过程中发现浮点数的运算会出现精度问题,尤其是乘除运算。产生浮点数计算精度不准确的原因: 在计算机角...

  • js 浮点数计算

    在做项目的时候,涉及到金额加减时,经常会出现计算精度的问题,常见例子如下: 在遇到浮点数运算后出现的精度问题时,起...

  • 【转载】JS - 浮点数运算的精度问题

    原文链接[https://blog.csdn.net/kelly0721/article/details/1145...

网友评论

      本文标题:JS中浮点数运算后的精度问题

      本文链接:https://www.haomeiwen.com/subject/howjyktx.html