js 解决浮点类型计算问题

比特破浪者
• 阅读 1357

方案一:直接上库(decimal.js)

使用简单粗暴,目前使用没有发现bug(我没发现)
源码还没来得及研究,具体实现未知...

new Decimal(参数1).add(new Decimal(参数2))

方案二:封装一个

大体思路就是 => 将两个值转为整数(乘)=> 求和 => 转为浮点型(除)

function sum(arg1, arg2) {
    /* 参数必须是数值类型 */
    if(isNaN(parseFloat(arg1))) return;
    if(isNaN(parseFloat(arg2))) return;
    /* 分别取参数小数位数 */
    let decimal_1 = (arg1.toString().split(".")[1] || "").length;
    let decimal_2 = (arg2.toString().split(".")[1] || "").length;
    /* 放大小数位最多位数的值进行求和(乘),将结果再缩小(除) */
    let enlargeLen = Math.pow(10, Math.max(decimal_1, decimal_2));
    return (arg1 * enlargeLen + arg2 * enlargeLen) / enlargeLen;
}

其他运算同理

总结:

为什么js浮点运算会有精度问题?
js 所有数据类型都是IEEE754 标准,是不区分浮点型和整数型,
但是计算机中都是以二进制存储数据的(大家都知道的),
但就在浮点型转二进制出现了问题

0.1 => 0.0001100110011001100110011001100110011001100110011001101
0.2 => 0.001100110011001100110011001100110011001100110011001101

所以...
详细说明 => https://www.cnblogs.com/zm-bl...

点赞
收藏
评论区
推荐文章
凯特林 凯特林
4年前
您知道JavaScript中的0.1 + 0.2 ≠ 0.3吗?
嘿👋自从我使用JavaScript已有一段时间了。昨天,我经历了一个非常奇怪的行为。同时我真的很困惑和惊讶😕。最初我以为,我发现了一个论点再次诅咒JavaScript。但是,经过一些研究,我发现这不是错误。这是数学,也是计算机处理数字的方式。好吧,还有其他一些怪异的东西幕后发生了什么?它背后的简单逻辑是计算机使用以2为基的(二进制)浮点数系统。让我们用一个
待兔 待兔
11个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
皕杰报表(关于日期时间时分秒显示不出来)
在使用皕杰报表设计器时,数据据里面是日期型,但当你web预览时候,发现有日期时间类型的数据时分秒显示不出来,只有年月日能显示出来,时分秒显示为0:00:00。1.可以使用tochar解决,数据集用selecttochar(flowdate,"yyyyMMddHH:mm:ss")fromtablename2.也可以把数据库日期类型date改成timestamp
Wesley13 Wesley13
3年前
mysql中时间比较的实现
MySql中时间比较的实现unix\_timestamp()unix\_timestamp函数可以接受一个参数,也可以不使用参数。它的返回值是一个无符号的整数。不使用参数,它返回自1970年1月1日0时0分0秒到现在所经过的秒数,如果使用参数,参数的类型为时间类型或者时间类型的字符串表示,则是从1970010100:00:0
Stella981 Stella981
3年前
JFinal支持Redis Sentinel
 项目中由redis单点服务,切换为redisSentinel集群模式,发现目前的jfinalplugin只支持单点服务,目前还没有提供Sentinel集群的支持,于是看了下插件源码与jedis源码,对原有的redisPlugin做了扩充,支持了Sentinel,项目经过了2个月的运行,目前还没有发现什么问题.使用示例如下Set<Hos
Stella981 Stella981
3年前
JVM启动参数的类别及使用
JVM启动参数还是比较实用的,于是我研究了一下它的用法,前段时间下了et项目,启动jBoss的时候出现了一个问题,查了一下,发现是jBoss配置的JVM启动参数有问题,总结了一下解决方案希望对你的学习有所帮助。JVM启动参数小结前段时间下了et项目,启动jBoss的时候出现了一个问题,查了一下,发现是jBoss配置的JVM启动参数有问题。后来
Wesley13 Wesley13
3年前
Java可选参数
问题:_HowdoIuseoptionalparametersinJava?_如何在Java中使用可选参数?_Whatspecificationsupportsoptionalparameters?_什么规范支持可选参数?解决方案:参考一:https://stackoo
可莉 可莉
3年前
2021年1月3日晚发现原作者源码bug的解决方案
2021年1月3日晚发现原作者源码bug的解决方案文章目录解决方案(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fblog.csdn.net%2Fqq_26525215%2Farticle%2Fdetails%2F112152271%23_30)
Wesley13 Wesley13
3年前
35岁是技术人的天花板吗?
35岁是技术人的天花板吗?我非常不认同“35岁现象”,人类没有那么脆弱,人类的智力不会说是35岁之后就停止发展,更不是说35岁之后就没有机会了。马云35岁还在教书,任正非35岁还在工厂上班。为什么技术人员到35岁就应该退役了呢?所以35岁根本就不是一个问题,我今年已经37岁了,我发现我才刚刚找到自己的节奏,刚刚上路。
Wesley13 Wesley13
3年前
ES某节点CPU增长至100%的诡异问题
这是一个从事发到目前为止我没有从根本上解决的技术问题,也是我心中的一个非常大的疑惑。写于:20200614周日,下午14:00问题已解决,解决过程和方案可以看文章最末尾,解决方案写于2020062015:26问题一:2020年6月4号上午10点左右(高峰期),A集群某节点,我们姑且称之为37号节点,CPU增长至100%
Stella981 Stella981
3年前
2021年1月3日晚发现原作者源码bug的解决方案
2021年1月3日晚发现原作者源码bug的解决方案文章目录解决方案(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fblog.csdn.net%2Fqq_26525215%2Farticle%2Fdetails%2F112152271%23_30)