//使用数字的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());
javascript天生的浮点数机制注定它不应该用于需要精确计算的应用中,虽然有好的解决方案,当对于需要精确计算的建议还是交给后台(非nodejs)来完成。曾经有人用nodejs去做3D打印,结果你懂的。。。
js 中没有真正意义上的浮点类型吧!
js中的数值运算都会先转换成二进制,然后再进行运算。
由于有些小数在转换时会产生无限循环,所以........
如果用js使用浮点类型的运算,最简单就乘以一个N*10的倍数,最后再除(上面也有说)
具体的解释
证明 0.99999... = 1
cause: 0.99999... 9 = 0.99999... (10 -1 ) = 9.99999.. - 0.99999... = 9 = 1 * 9
so: 0.99999... = 1
如果不是金融的话,取一下小数位数吧
这些计算应该都是在后端.如果前端只是简单的计算展示,就保留 N 位小数吧.
这是任何语言都存在的,"
浮点数的精度问题
", 在其他语言里面都有一个高精度数学模块
能够处理这类型的需求,比如php中的bc模块
js中,就量力而行吧, 手动的控制小数位我的做法是转string,计算小数点位置,移除小数点,算术运算,添加小数点
你司做金融的还用Node来跑金融数据, 吃枣药丸
那估计就只能用bigDecimal.js进行运算了
好久以前写过一个小库,自以为还挺好用的。核心也就是先转整数,运算完成再转小数,当然转的方法不是像@mcfog兄反对的那样直接乘以100,要不还是会出现问题的,而是先转字符串去掉小数点。
用法如下:
源码在这里下载:https://pan.baidu.com/s/1qYwGOP2