javascript - js中两个小数相减,出现的多位小数
高洛峰
高洛峰 2017-04-11 11:03:38
0
19
1381

这个用js怎么解决,我们是金融公司,所以希望有好的解决方案,两个数同时放大也一样

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全員に返信(19)
Ty80

javascript天生的浮点数机制注定它不应该用于需要精确计算的应用中,虽然有好的解决方案,当对于需要精确计算的建议还是交给后台(非nodejs)来完成。曾经有人用nodejs去做3D打印,结果你懂的。。。

いいねを押す +0
小葫芦

js 中没有真正意义上的浮点类型吧!
js中的数值运算都会先转换成二进制,然后再进行运算。
由于有些小数在转换时会产生无限循环,所以........
如果用js使用浮点类型的运算,最简单就乘以一个N*10的倍数,最后再除(上面也有说)
具体的解释

いいねを押す +0
伊谢尔伦

证明 0.99999... = 1
cause: 0.99999... 9 = 0.99999... (10 -1 ) = 9.99999.. - 0.99999... = 9 = 1 * 9
so: 0.99999... = 1

如果不是金融的话,取一下小数位数吧

いいねを押す +0
小葫芦

这些计算应该都是在后端.如果前端只是简单的计算展示,就保留 N 位小数吧.

いいねを押す +0
伊谢尔伦

这是任何语言都存在的,"浮点数的精度问题", 在其他语言里面都有一个高精度数学模块能够处理这类型的需求,比如php中的bc模块 js中,就量力而行吧, 手动的控制小数位

いいねを押す +0
巴扎黑

我的做法是转string,计算小数点位置,移除小数点,算术运算,添加小数点

いいねを押す +0
阿神

你司做金融的还用Node来跑金融数据, 吃枣药丸

いいねを押す +0
刘奇

那估计就只能用bigDecimal.js进行运算了

いいねを押す +0
Peter_Zhu

好久以前写过一个小库,自以为还挺好用的。核心也就是先转整数,运算完成再转小数,当然转的方法不是像@mcfog兄反对的那样直接乘以100,要不还是会出现问题的,而是先转字符串去掉小数点。

用法如下:

//使用数字的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.pide(2.22);   
assertEquals("6.66/2.22", 3, res.valueOf());  

源码在这里下载:https://pan.baidu.com/s/1qYwGOP2

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート