Heim  >  Fragen und Antworten  >  Hauptteil

javascript - js中两个小数相减,出现的多位小数

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

高洛峰高洛峰2750 Tage vor1260

Antworte allen(19)Ich werde antworten

  • PHP中文网

    PHP中文网2017-04-11 11:05:38

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

    Antwort
    0
  • 高洛峰

    高洛峰2017-04-11 11:05:38

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

    Antwort
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-11 11:05:38

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

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

    Antwort
    0
  • 高洛峰

    高洛峰2017-04-11 11:05:38

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

    Antwort
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-11 11:05:38

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

    Antwort
    0
  • 巴扎黑

    巴扎黑2017-04-11 11:05:38

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

    Antwort
    0
  • 阿神

    阿神2017-04-11 11:05:38

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

    Antwort
    0
  • 怪我咯

    怪我咯2017-04-11 11:05:38

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

    Antwort
    0
  • 天蓬老师

    天蓬老师2017-04-11 11:05:38

    好久以前写过一个小库,自以为还挺好用的。核心也就是先转整数,运算完成再转小数,当然转的方法不是像@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

    Antwort
    0
  • StornierenAntwort