js 浮点小数计算精度问题 parseFloat 精度问题

在js中进行以元为单位进行金额计算时 使用parseFloat会产生精度问题
var price = 10.99;
var quantity = 7;
var needPay = parseFloat(price * quantity);

needPay的正确结果应该是76.93元  但是运行后发现needPay为76.93000000000001 
此情况可通过 toFixed(n)  方法修正 但是这个方法对 js版本要求较高 不能兼容ie5

另一个解决方案是: 将元为单位的金额乘以100换算为分进行计算

var price = 10.99
var quantity = 7
var needPay = Math.floor(parseFloat(price*100 * quantity))/100;

parseFloat(price*100 * quantity)的计算结果是7693.000000000001   使用Math.round()方法四舍五入,再除100  即为正确的结果

PS:顺便学到了一点:Math.ceil() Math.floor() Math.round() 的区别
Math.ceil() 是向上取整
Math.floor()是向下取整
Math.round()是四舍五入

        //保留两位小数
        //功能:将浮点数四舍五入,取小数点后2位
        function toDecimal(x) {
            var f = parseFloat(x);
            if (isNaN(f)) {
                return;
            }
            f = Math.round(x*100)/100;
            return f;
        }  

        //制保留2位小数,如:2,会在2后面补上00.即2.00
        function toDecimal2(x) {
            var f = parseFloat(x);
            if (isNaN(f)) {
                return false;
            }
            var f = Math.round(x*100)/100;
            var s = f.toString();
            var rs = s.indexOf(‘.‘);
            if (rs < 0) {
                rs = s.length;
                s += ‘.‘;
            }
            while (s.length <= rs + 2) {
                s += ‘0‘;
            }
            return s;
        }  

        function fomatFloat(src,pos){
             return Math.round(src*Math.pow(10, pos))/Math.pow(10, pos);
        }
        //四舍五入
        alert("保留2位小数:" + toDecimal(3.14159267));
        alert("强制保留2位小数:" + toDecimal2(3.14159267));
        alert("保留2位小数:" + toDecimal(3.14559267));
        alert("强制保留2位小数:" + toDecimal2(3.15159267));
        alert("保留2位小数:" + fomatFloat(3.14559267, 2));
        alert("保留1位小数:" + fomatFloat(3.15159267, 1));  

        //五舍六入
        alert("保留2位小数:" + 1000.003.toFixed(2));
        alert("保留1位小数:" + 1000.08.toFixed(1));
        alert("保留1位小数:" + 1000.04.toFixed(1));
        alert("保留1位小数:" + 1000.05.toFixed(1));  

        //科学计数
        alert(3.1415.toExponential(2));
        alert(3.1455.toExponential(2));
        alert(3.1445.toExponential(2));
        alert(3.1465.toExponential(2));
        alert(3.1665.toExponential(1));
        //精确到n位,不含n位
        alert("精确到小数点第2位" + 3.1415.toPrecision(2));
        alert("精确到小数点第3位" + 3.1465.toPrecision(3));
        alert("精确到小数点第2位" + 3.1415.toPrecision(2));
        alert("精确到小数点第2位" + 3.1455.toPrecision(2));
        alert("精确到小数点第5位" + 3.141592679287.toPrecision(5));

  

原文地址:https://www.cnblogs.com/zuobaiquan01/p/10363212.html

时间: 2024-10-12 08:43:34

js 浮点小数计算精度问题 parseFloat 精度问题的相关文章

js浮点金额计算精度

在js中进行以元为单位进行浮点数计算时,会产生精度问题,例如: console.log(0.1+0.2) 结果为:0.30000000000000004 大多数编程语言计算采用的是IEEE 754 标准,那么先来看下浮点数运算产生误差的原因,拿0.1+0.2=0.30000000000000004举例. 首先,站在计算机的角度思考 0.1 + 0.2 这个问题.我们知道,能被计算机读懂的是二进制,而不是十进制,所以我们先把 0.1 和 0.2 转换成二进制看看: 0.1 => 0.0001 10

解决JS浮点数(小数)计算加减乘除的BUG

/**  ** 加法函数,用来得到精确的加法结果  ** 说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显.这个函数返回较为精确的加法结果.  ** 调用:accAdd(arg1,arg2)  ** 返回值:arg1加上arg2的精确结果  **/ function accAdd(arg1, arg2) {     var r1, r2, m, c;     try {         r1 = arg1.toString().split(".")[1].

js 小数计算失去精度

原因:小数计算会转化为二进制 精度丢失 举个例子:4.02*10的N次方 怎么算都是错的; 常见问题 0.1+0.2 !=0.3 ... 处理:转化为小数进行计算 //加法 function addNum (a,b){  var c,d,e; try {       c = a.toString().split(".")[1].length; } catch (f) {       c = 0; }   try {       d = b.toString().split("

java用double和float进行小数计算精度不准确

java用double和float进行小数计算精度不准确 大多数情况下,使用double和float计算的结果是准确的,但是在一些精度要求很高的系统中或者已知的小数计算得到的结果会不准确,这种问题是非常严重的. <Effective Java>中提到一个原则,那就是float和double只能用来作科学计算或者是工程计算,但在商业计算中我们要用java.math.BigDecimal,通过使用BigDecimal类可以解决上述问题,java的设计者给编程人员提供了一个很有用的类BigDecim

[转载]JavaScript 中小数和大整数的精度丢失

标题: JavaScript 中小数和大整数的精度丢失作者: Demon链接: http://demon.tw/copy-paste/javascript-precision.html版权: 本博客的所有文章,都遵守“署名-非商业性使用-相同方式共享 2.5 中国大陆”协议条款. 先来看两个问题: 0.1 + 0.2 == 0.3; // false 9999999999999999 == 10000000000000000; // true 第一个问题是小数的精度问题,在业界不少博客里已有讨论

HTML页面添加HTML代码的拼接字符串;以及js里面的小数计算

(1)var tr = ""; tr = '<tr><td>银行转账</td><td>'+O_AMOUNT+'</td><td>'+P_DT+'</td><td></td><td></td><td></td><td>'+P_HL_ZH+'</td>           <td>'+P_U_ZH+'

计算机程序的思维逻辑 - 小数计算为什么会出错?

违反直觉的事实 计算机之所以叫"计算"机就是因为发明它主要是用来计算的,"计算"当然是它的特长,在大家的印象中,计算一定是非常准确的.但实际上,即使在一些非常基本的小数运算中,计算的结果也是不精确的. 比如: float f = 0.1f*0.1f; System.out.println(f); 这个结果看上去,不言而喻,应该是0.01,但实际上,屏幕输出却是0.010000001,后面多了个1. 看上去这么简单的运算,计算机怎么会出错了呢? 简要答案 实际上,不是

js中小数的判断和运算

判断小数的方法: if(String(newNum).indexOf(".")>-1){ alert('小数!') }else{ alert("非小数"); } 小数和整数的相加,最简便的方法: function getAmount(){ var proltotal=0; jQuery('.littletotal').each(function(){ // 乘1能转为数字,直接相加会自动调整精度,否则是字符串的连接 var rowtotle2=jQuery(t

【转】FPGA内部小数计算

FPGA内部计算小数 [转载] 谓定点小数,就是小数点的位置是固定的.我们是要用整数来表示定点小数,由于小数点的位置是固定的,所以就没有必要储存它(如果储存了小数点的位置,那就是浮点数了).既然没有储存小数点的位置,那么计算机当然就不知道小数点的位置,所以这个小数点的位置是我们写程序的人自己需要牢记的. 先以10进制为例.如果我们能够计算12+34=46的话,当然也就能够计算1.2+3.4 或者 0.12+0.34了.所以定点小数的加减法和整数的相同,并且和小数点的位置无关.乘法就不同了. 12