function NumRound(a_Num, a_Bit) {
    //alert(a_Num + "\n" + Math.pow(10, a_Bit) + "\n" + a_Num * Math.pow(10, a_Bit))
    return ((Math.round(a_Num * Math.pow(10, a_Bit)) / Math.pow(10, a_Bit)).toFixed(a_Bit));
}我发现用NumRound(99999999999999999,2)
测试的时候就不对。
大家可以把函数内的alert不注释,让他弹习试试。或者说是不是js只能在一定范围内进行这个转换。?

解决方案 »

  1.   

    js 数值精度问题,js 不适于做高精计算,
    高精度计算还是在 Server 端执行吧!
      

  2.   

    不用顶了,ls已经说了,js不适合做高精度运算,
      

  3.   

    做个试验就都清楚了,整数位15位以后就废了!L@_@K
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
     <head>
      <title> new document </title>
      <meta name="generator" content="editplus" />
      <meta name="author" content="" />
      <meta name="keywords" content="" />
      <meta name="description" content="" />
     </head> <body><script language="javascript" type="text/javascript">
    var numStr = "";
    var charNine = "9";
    var maxLength = 20;
    for (var i=1; i<=maxLength; i++)
    {
    numStr += charNine;
    document.write(i, ": Str: ", numStr, " Num: ",parseInt(numStr), "<br />");
    }/*
    1: Str: 9 Num: 9
    2: Str: 99 Num: 99
    3: Str: 999 Num: 999
    4: Str: 9999 Num: 9999
    5: Str: 99999 Num: 99999
    6: Str: 999999 Num: 999999
    7: Str: 9999999 Num: 9999999
    8: Str: 99999999 Num: 99999999
    9: Str: 999999999 Num: 999999999
    10: Str: 9999999999 Num: 9999999999
    11: Str: 99999999999 Num: 99999999999
    12: Str: 999999999999 Num: 999999999999
    13: Str: 9999999999999 Num: 9999999999999
    14: Str: 99999999999999 Num: 99999999999999
    15: Str: 999999999999999 Num: 999999999999999
    16: Str: 9999999999999999 Num: 10000000000000000
    17: Str: 99999999999999999 Num: 100000000000000000
    18: Str: 999999999999999999 Num: 1000000000000000000
    19: Str: 9999999999999999999 Num: 10000000000000000000
    20: Str: 99999999999999999999 Num: 100000000000000000000
    */
    </script> </body>
    </html>
      

  4.   

    纯小数位 16 位以后废了!L@_@K
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
     <head>
      <title> new document </title>
      <meta name="generator" content="editplus" />
      <meta name="author" content="" />
      <meta name="keywords" content="" />
      <meta name="description" content="" />
     </head> <body><script language="javascript" type="text/javascript">
    function NumRound(a_Num, a_Bit) {
        //alert(a_Num + "\n" + Math.pow(10, a_Bit) + "\n" + a_Num * Math.pow(10, a_Bit))
        return ((Math.round(a_Num * Math.pow(10, a_Bit)) / Math.pow(10, a_Bit)).toFixed(a_Bit));
    }//var numStr = "";
    var numStr = "0.";
    var charNine = "9";
    var maxLength = 20;
    for (var i=1; i<=maxLength; i++)
    {
    numStr += charNine;
    //document.write(i, ": Str: ", numStr, " Num: ",parseInt(numStr), "<br />");
    document.write(i, ": Str: ", numStr, " Num: ",parseFloat(numStr), "<br />");
    }/*
    Int
    1: Str: 9 Num: 9
    2: Str: 99 Num: 99
    3: Str: 999 Num: 999
    4: Str: 9999 Num: 9999
    5: Str: 99999 Num: 99999
    6: Str: 999999 Num: 999999
    7: Str: 9999999 Num: 9999999
    8: Str: 99999999 Num: 99999999
    9: Str: 999999999 Num: 999999999
    10: Str: 9999999999 Num: 9999999999
    11: Str: 99999999999 Num: 99999999999
    12: Str: 999999999999 Num: 999999999999
    13: Str: 9999999999999 Num: 9999999999999
    14: Str: 99999999999999 Num: 99999999999999
    15: Str: 999999999999999 Num: 999999999999999
    16: Str: 9999999999999999 Num: 10000000000000000
    17: Str: 99999999999999999 Num: 100000000000000000
    18: Str: 999999999999999999 Num: 1000000000000000000
    19: Str: 9999999999999999999 Num: 10000000000000000000
    20: Str: 99999999999999999999 Num: 100000000000000000000Float
    1: Str: 0.9 Num: 0.9
    2: Str: 0.99 Num: 0.99
    3: Str: 0.999 Num: 0.999
    4: Str: 0.9999 Num: 0.9999
    5: Str: 0.99999 Num: 0.99999
    6: Str: 0.999999 Num: 0.999999
    7: Str: 0.9999999 Num: 0.9999999
    8: Str: 0.99999999 Num: 0.99999999
    9: Str: 0.999999999 Num: 0.999999999
    10: Str: 0.9999999999 Num: 0.9999999999
    11: Str: 0.99999999999 Num: 0.99999999999
    12: Str: 0.999999999999 Num: 0.999999999999
    13: Str: 0.9999999999999 Num: 0.9999999999999
    14: Str: 0.99999999999999 Num: 0.99999999999999
    15: Str: 0.999999999999999 Num: 0.999999999999999
    16: Str: 0.9999999999999999 Num: 0.9999999999999999
    17: Str: 0.99999999999999999 Num: 1
    18: Str: 0.999999999999999999 Num: 1
    19: Str: 0.9999999999999999999 Num: 1
    20: Str: 0.99999999999999999999 Num: 1
    */
    </script> </body>
    </html>
      

  5.   

    经过试验发现,俺机器上的 js 数字精度如下:纯整数,即没有小数部分,最多显示 15 个 9;
    纯小数,即整数部分为0,最多显示 16 个 9;
    普通小数,整数、小数部分都有且非零,
    精度为(16, F),16 为整数部分与小数部分位数之和,F 为小数部分位数!这只是显示,并不保证此精度内的计算就是准确的,
    因为运算中会有无限循环小数,也会发生精度丢失的问题!
      

  6.   

    =><script>alert('dfafa')</script>