博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Javascipt中精确小数运算的实现
阅读量:6816 次
发布时间:2019-06-26

本文共 1364 字,大约阅读时间需要 4 分钟。

以前的旧文,貌似还是挺有用的,在这里记一下避免丢失:

基于Web的应用程序,经常需要在页面中作些简单的计算,用作数据提交前的验证,或者给用户提供更友好的信息。但由于十进制小数并不总能用二进制小数精确表示,在进行小数运算时,经常会出现“莫明其妙”的误差,比如“33*2.46=81.179999999999999”之类的。如果要在页面上显示计算结果,特别是当这个结果表示金额的时候,误差通常是不可容忍的。

网上有人说Javasript不能做精确运算,所以会出现误差云云。这当然是不对的,这种情况应该是由计算机二进制表示的本质决定的。应该说,Javascript的表现其实还好一些,因为在数字进行运算之前,我们总是可以得到它的精确表示(字符串)。

解决问题的基本思路就是牺牲速度换精度,逐位进行运算,并且自己在程序逻辑中实现进位。为此,Java提供了BigDecimal类。而在Javascript中,我们就没这么幸运了,没有现成的类库可供使用。可能是制订规范的人也认为没必要使用JS来做“科学计算”吧。

我以前做的项目中,经常会碰到计算金额总价、合计、总计之类的“商业计算”,对精确小数运算的需求还是比较迫切的,所以自己开发了一个小数运算的“类”。实现这个类的时候,使用了投机取巧的办法:把小数转换为整数,运算完成后,再转换回去。它唯一能解决的问题就是:避免十进制小数和二进制小数之间的转换误差;它不能提高运算的精度(有效数字),也不能扩大数字的表示范围。

使用方法如下:

//使用数字的literal表示,创建一个Decimal对象    var d1 = new Decimal(3.68);    //调用该对象的四则运算方法,得到一个新的Decimal对象   var res=d1.add(2.25);    //调用该对象的valueOf方法,得到数值   alert( res.valueOf() ); //显示 5.93    //或者调用该对象的toString方法,得到数值的字符串表示   alert( res.toString() ); //显示 5.93      //可用的运算方法对应四则运算的+、-、×、÷   var d1 = new Decimal(3.68);   var res=d1.add(2.25);   assertEquals("3.68+2.25", "5.93", res.toString());     var d1 = new Decimal(3.68);   var res=d1.minus(2.25);   assertEquals("3.68-2.25", "1.43", res.toString());     var d1 = new Decimal(2.22);   var res=d1.multiply(3.33);   assertEquals("2.22*3.33", 7.3926, res.valueOf());     var d1 = new Decimal(6.66);   var res=d1.divide(2.22);   assertEquals("6.66/2.22", 3, res.valueOf());

源码在这里下载:

转载地址:http://qvdzl.baihongyu.com/

你可能感兴趣的文章
专注dApp高效执行和高并发的下一代公有链
查看>>
ONE-sys 整合前后端脚手架 koa2 + pm2 + vue-cli3.0 + element
查看>>
携带更方便功能全 iPone与Apple Watch球形尿袋
查看>>
行为型模式:策略模式
查看>>
实现批量数据增强 | keras ImageDataGenerator使用
查看>>
太忙女友消息未及时回复,分手吗?python微信自动消息帮你谈恋爱
查看>>
Java 多线程NIO学习
查看>>
命名实体识别
查看>>
动态切换的动态代理
查看>>
电商项目(下)
查看>>
vue 数字滚动递增效果
查看>>
vue2.0中父子,兄弟组件的传值2
查看>>
Spring Boot注解常用!!!看了就可以开发大量项目了
查看>>
音频编码 Audio Converter
查看>>
SQL - case when then else end 的用法
查看>>
web优化是http缓存(上)
查看>>
19-01-14
查看>>
媒体融合三部曲(未完待续...)
查看>>
OkHttp3-拦截器(Interceptor)
查看>>
Bootstrap在实际生产开发中的使用心得
查看>>