js四舍五入不显示.00

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js四舍五入不显示.00相关的知识,希望对你有一定的参考价值。

js四舍五入不显示.00
中四舍六入五成双最后为零不显示
2023-01-11
JS013. 重写toFixed( )方法,toFixed()原理 - 四舍五入?银行家舍入法?No!六舍七允许四舍五入√!
JS toFixed 四舍六入五成双
C#采用的是“四舍六入五成双”、上取整、下取整
四舍六入五成双银行家算法的 phpjavascript实现
js中时间戳转换成时间格式
JS中的五种去重方法
(转载) js 单引号替换成双引号,双引号替换成单引号 操作
js中对象转化成字符串、数字或布尔值的转化规则
JS 中的五个假值
js 中日期 转换成时间戳 例如2013-08-30 转换为时间戳
js中时间戳转化成时间格式
js中字符串处理成数字的方法
js中时间戳转换成xxxx-xx-xx xx:xx:xx类型日期格式的做法
JS中toFixed()方法的问题及解决方案
js中toFixed精度问题的解决办法
JS中令人发指的valueOf方法介绍
jsp中的js中获取项目路径的方法
js中int和string数据类型互相转化实例
js中style.display=""无效的解决方法
JS中的日期内置函数
参考技术A 调用toFixed四舍五入
// 如果去零时需要保留位数: (比如 19.520100 --> 19.52)
parseFloat(Number(19.520100).toFixed(2))

调用parseFloat去掉0
// 如果只想去除小数点后多余的0 (比如 18.2300 --> 18.23)
parseFloat(arg)
参考技术B 调用toFixed四舍五入
// 如果去零时需要保留位数: (比如 19.520100 --> 19.52)
parseFloat(Number(19.520100).toFixed(2))

调用parseFloat去掉0
// 如果只想去除小数点后多余的0 (比如 18.2300 --> 18.23)
parseFloat(arg)

js四舍五入问题 不准确

500.50*6.97结果为3488.485
四舍五入保留两位应该是3488.49
结果却是3488.48
我用Math.round()
和toFixed(2)
都一样结果,
有没有简单处理办法??
求高手…
要求简单,不要复杂公式…

你的这个问题貌似连续问了好几天,也问了好几个了,难道一直都没有解决的吗?


如果你一直都没有理解的话,那么我来给你仔细地讲一讲。


首先我们来看一段JS代码:


var a = 500.50;
var b = 6.97;
var result = a*b;
alert(result);


那么,我们alert之后的结果是:

3488.4849999999997

为什么这样?


网上有网友说,这是JavaScript的浮点数运算BUG,其实,并不能算是BUG,而是由于浮点数计算精度造成的误差;


这样一来,你所说的结果为3488.485,对于JavaScript来说,就不准确了。


然后我们再来看下面的代码:

var a = 500.50;
var b = 6.97;
var c = a*b;    //这里的a*b其实是3488.4849999999997
var result = Math.round(c*100)/100; //那么它乘以100之后是348848.49999999997
                                    //然后,取整后是348848,除100后是3488.48
alert(result); //结果自然就是3488.48


输出:

3488.48


好的,到这里相信你已经知道它产生的原因了,如果你想更细化地知道它为什么会出现那么多的小数位,可以看这篇文章的相关介绍:


【float浮点数的二进制存储方式及转换】http://blog.csdn.net/zcczcw/article/details/7362473


那么接下来,看看如何解决这个问题:


我们知道,问题是出在了二进制数据计算和保存的过程之中,那么,我们就要在它进行计算和保存之前,对其进行处理,


如何处理呢?我们已经知道最初参与计算的两位浮点数都是两位小数,同时我们还需要以两位小数后面的一位小数来决定是否四舍五入,这样,我们将其中一个浮点数的小数点后移3位,这样能够让我们获取到的结果保持在我们需要的小数位后3位都在整数部分,也就不存在浮点数BUG的问题了:

var a = 500.50*1000; //让其中一个参与运算的浮点数小数点后移3位
var b = 6.97;
var c = a*b/1000; //计算完成后,再前移三位
alert(c); //我们得到的中间值结果准确!
var result = Math.round(c*100)/100; //再参与四舍五入计算
alert(result); //结果准确


输出结果 :

3488.49


另外,像这样在JavaScript下计算浮点数的过程由于经常会出现这种不可控的现象,所以,聪明的程序工程师们写了很多规避这种不可控现象的函数,下面就给你提供一些这方面的资料:


【js浮点数精确计算函数(加,减,乘,除)】 http://www.cnblogs.com/konooo/archive/2010/01/23/1654617.html


【JS浮点数运算Bug的解决办法】 http://hi.baidu.com/bing2liuliu/item/6b201a48ea51c40b6dc2f0b6


——————

最后我想说的是,我这几天混迹于百度知道,至少看你问过这个问题四遍了,也就是说,这个问题是我看到的你的第四个相同的问题。


而你在其它几个问题里,并不是没有得到答案,而那几个问题回答的答案也相对比较明确了。


你所要求的:“不要什么公式”、“简单的”等要求,是有的,粘贴复制就可以了,把他们提供的方法粘贴到你的代码上,调用就可以了。


但这样好像还无法满足你,让我们这些为此兢兢业业,试图解决各种有挑战性问题的网友和程序员们情何以堪呐!


我真想写几K的文档,就建完了一个站,但它不现实不是....

参考技术A         cheng(123.456,2);//保留两位小数
        function cheng(num,n)
            var  dd=1;  
            var  tempnum;  
            for(i=0;i<n;i++)
                dd*=10;  
              
            tempnum = num*dd;
            tempnum = Math.round(tempnum);  
            alert(tempnum/dd);  
        

参考技术B <script>
//乘法函数,用来得到精确的乘法结果 
//说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
 //调用:accMul(arg1,arg2) 
 //返回值:arg1乘以arg2的精确结果 
 
 function accMul(arg1,arg2)  
 var m=0,s1=arg1.toString(),s2=arg2.toString(); 
 try m+=s1.split(".")[1].length; catch(e)
  try  m+=s2.split(".")[1].lengthcatch(e) 
  return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m)
    
   
   
//除法函数,用来得到精确的除法结果 
//说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。
//调用:accDiv(arg1,arg2) 
//返回值:arg1除以arg2的精确结果 
function accDiv(arg1,arg2) 
var t1=0,t2=0,r1,r2; 
tryt1=arg1.toString().split(".")[1].lengthcatch(e) 
tryt2=arg2.toString().split(".")[1].lengthcatch(e) 
with(Math)
 r1=Number(arg1.toString().replace(".","")) 
 r2=Number(arg2.toString().replace(".",""))
  return (r1/r2)*pow(10,t2-t1); 
   
  
 
 
//加法函数,用来得到精确的加法结果 
//说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。 
//调用:accAdd(arg1,arg2) 
//返回值:arg1加上arg2的精确结果 
function accAdd(arg1,arg2)
 var r1,r2,m; 
 tryr1=arg1.toString().split(".")[1].lengthcatch(e)r1=0
  tryr2=arg2.toString().split(".")[1].lengthcatch(e)r2=0
   m=Math.pow(10,Math.max(r1,r2))
    return (arg1*m+arg2*m)/m
      


//减法函数,用来得到精确的减法结果
//调用:Subtr(arg1,arg2) 
//返回值:arg1减去arg2的精确结果  
function Subtr(arg1,arg2)   
  var r1,r2,m,n;  
     tryr1=arg1.toString().split(".")[1].lengthcatch(e)r1=0  
        tryr2=arg2.toString().split(".")[1].lengthcatch(e)r2=0  
           m=Math.pow(10,Math.max(r1,r2));    
            //last modify by deeka     
            //动态控制精度长度    
             n=(r1>=r2)?r1:r2;   
               return ((arg1*m-arg2*m)/m).toFixed(n);
               
</script>

希望对你有帮助。

参考技术C         rounds(123.454,2);//保留两位小数
        function rounds(num,n)
            var  dd=1;  
            var  tnum=Math.pow(10,n);  
            return Math.round(num*tnum)/tnum;  
         

以上是关于js四舍五入不显示.00的主要内容,如果未能解决你的问题,请参考以下文章

js将相除结果百分比 ,四舍五入函数 toFixed()

angular js中怎样四舍五入

js保留两位小数,不四舍五入

js保留小数位

js javascript 四舍五入结果不正确 不对

Javascript显示货币不四舍五入