js加减乘除运算出现精度丢失
做乘法运算出现精度丢失
let aa= 2106.49
console.log( aa*10000 ) //21064899.999999996
console.log( Math.round(aa*10000) ) //21064900
需求
因为输入的数字最多保留两位小数
当时想的是乘一个10000;【将元转化为万元】
是不会出现精度丢失这样的情况的
结果这填写金额的时候
啪啪打脸了,竟然出现了精度丢失的情况
关于Math.round的讲解
// 实际上,Math.round()方法四舍五入是不准确的哈【对正数来说正确】
// ,Math.round()方法四舍五入【对负数是不正确的】
注意-1.5=-1; [-1.6,-1.7,-1.8,-1.9]=2
还有需要注意的点是 Math.round()是一个整数
不会出现aaa.00,,bb.0这样的情况
console.log(Math.round(1.0)); //1
console.log( Math.round(1.4)) //1
console.log( Math.round(1.5)); //2
console.log( Math.round(-1.0));//-1
console.log(Math.round(-1.4)); //-1
console.log(Math.round(-1.5)) ; //-1
console.log(Math.round(-1.6)) //-2
console.log(Math.round(-1.7)) //-2
整数的Math.round()是整数本省;
我使用
Math.round(aa*10000)来处理精度丢失是没有问题的
因为 Math.round()的是整数本身
使用Math.round的返回值有哪些
console.log( Math.round('1.X5')); //NaN
console.log( Math.round(null));//0
console.log(Math.round('0')); //0
console.log(Math.round('NaN')) ; //NaN
console.log(Math.round(undefined)) //NaN
console.log(Math.round('1.2121')) //1
console.log( Math.round('1.9')); //NaN
通过上面这个例子,我们发现 Math.round返回值有
NaN 和数字类型
null返回的是0;因为null表示的写了一个变量没有赋值就是null
如果你使用 Math.round是一个数字类型的字符串也是没有问题的,它仍然可以正确返回来
除法
function accDiv(arg1, arg2) {
var t1 = 0,
t2 = 0,
r1, r2;
try {
t1 = arg1.toString().split(".")[1].length
} catch (e) {}
try {
t2 = arg2.toString().split(".")[1].length
} catch (e) {}
with(Math) {
r1 = Number(arg1.toString().replace(".", ""))
r2 = Number(arg2.toString().replace(".", ""))
return accMul((r1 / r2), pow(10, t2 - t1));
}
}
乘法
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].length
} catch (e) {}
return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m)
}
加法
function accAdd(arg1, arg2) {
var r1, r2, m;
try {
r1 = arg1.toString().split(".")[1].length
} catch (e) {
r1 = 0
}
try {
r2 = arg2.toString().split(".")[1].length
} catch (e) {
r2 = 0
}
m = Math.pow(10, Math.max(r1, r2))
return (arg1 * m + arg2 * m) / m
}
上面这个版本在在有些数字相加是会出问题的
改成下面的版本
function addd(arg1, arg2) {
arg1 = arg1?arg1:0
arg2 = arg2?arg2:0
let r1, r2, m, c;
try {
r1 = arg1.toString().split(".")[1].length;
}
catch (e) {
r1 = 0;
}
try {
r2 = arg2.toString().split(".")[1].length;
}
catch (e) {
r2 = 0;
}
c = Math.abs(r1 - r2);
m = Math.pow(10, Math.max(r1, r2));
if (c > 0) {
let cm = Math.pow(10, c);
if (r1 > r2) {
arg1 = Number(arg1.toString().replace(".", ""));
arg2 = Number(arg2.toString().replace(".", "")) * cm;
} else {
arg1 = Number(arg1.toString().replace(".", "")) * cm;
arg2 = Number(arg2.toString().replace(".", ""));
}
} else {
arg1 = Number(arg1.toString().replace(".", ""));
arg2 = Number(arg2.toString().replace(".", ""));
}
return (arg1 + arg2) / m;
}
console.log("xx",addd(10219.63, 120.56))
减法
function Subtr(arg1, arg2) {
var r1, r2, m, n;
try {
r1 = arg1.toString().split(".")[1].length
} catch (e) {
r1 = 0
}
try {
r2 = arg2.toString().split(".")[1].length
} catch (e) {
r2 = 0
}
m = Math.pow(10, Math.max(r1, r2));
n = (r1 >= r2) ? r1 : r2;
return ((arg1 * m - arg2 * m) / m).toFixed(n);
}
尾声
如果你觉得我写的不错或者对你有帮助的话,
能不能请我吃一包辣条,就一包就可以了。
感谢~,我已经好久咩有吃辣条了!
感谢感谢~
js加减乘除运算出现精度丢失的更多相关文章
- 关于Java中用Double型运算时精度丢失的问题
注:转自 https://blog.csdn.net/bleach_kids/article/details/49129943 在使用Java,double 进行运算时,经常出现精度丢失的问题,总是在 ...
- java数值运算后精度丢失问题
最近连续俩次遇到运算后数值精度丢失问题,所以记录一下. 问题1:java计算百分比,应该得到57,可返回的就是56 在java代码中 BigDecimal progress; BigDecimal a ...
- JS小数运算失精度的问题
JS因为是解释性语言,在运算中会有丢失精度的问题,这种现象多出现在浮点型运算的情况下. 例如 5.11 * 100 得到的结果是 511.00000000000006 这种情况尤其是在处理金额的时候 ...
- js 浮点运算出现的精度丢失问题
var myf='6.202555'; myf=Number(myf).toFixed(2);//使用方法 Number.prototype.toFixed = function(scale) { v ...
- JS处理Long类型精度丢失问题
解决方式一 json注解 public class ProductVo { @JsonSerialize(using=ToStringSerializer.class) private Lo ...
- js加减乘除丢失精度
js加减乘除(学了那么久现在才注意到汗==!) /** ** 除法函数,用来得到精确的除法结果 ** 说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显.这个函数返回较为精 ...
- js数字位数太大导致参数精度丢失问题
最近遇到个比较奇怪的问题,js函数里传参,传一个位数比较大,打印arguments可以看到传过来的参数已经改变. 然后查了一下,发现确实是js精度丢失造成的.我的解决方法是将数字型改成字符型传输,这样 ...
- Java 避免精度丢失之BigDecimal 运算
* 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精确的浮点数运算,包括加减乘除和四舍五入 import java.math.BigDecimal; /** 计算工具类 */ pu ...
- js float运算精度问题
先放个前辈的文章:JavaScript数字精度丢失问题总结 今天遇到了19.99*100的问题,答案不等于1999,因为在javascript中浮点数的计算是以2进制计算的.自己写了一波解决方法(不能 ...
- java字符串类型数学运算表达式以及精度丢失问题
字符串类型数学运算精度丢失问题 方式一:ScriptEngine 会精度丢失,可执行连续双括号 方式二:hutool ScriptUtil 会精度丢失,可执行连续双括号 方式三:hutool Scri ...
随机推荐
- 面试官:说一下Jena推理
摘要:本文介绍了Jena的推理子系统,并构建了一个简单的RDF图.基于该RDF图,我们搭建了一个Jena推理引擎,并进行自动化推理. 本文分享自华为云社区<知识推理之基于jena的知识推理(三) ...
- 最后一天,CDMP数据治理认证高分训练营(9-10月)开放报名!
大家好,我是独孤风,一位曾经的港口煤炭工人,目前在某国企任大数据负责人,公众号大数据流动主理人. 首先告诉大家一个好消息,在大家共同的努力下,我们的CDMP国际数据治理认证训练营(7-8月)基本收官, ...
- 当OLAP碰撞Serverless,看ByteHouse如何建设下一代云计算架构
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 作为云计算的下一个迭代,Serverless 可以使开发者更专注于构建产品中的应用,而无需考虑底层堆栈问题.伴随着 ...
- 如何打造企业专属 A/B 平台?火山引擎 DataTester 开放平台技术揭秘
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 企业为什么需要开放平台 开放平台对于企业与业务来说,做到的不仅是能力的开放.生态的开放,与此同时还要能提供完善的业 ...
- Solon2 开发之IoC,七、切面与函数环绕拦截
想要环绕拦截一个 Bean 的函数.需要三个前置条件: 通过注解做为"切点",进行拦截(不能无缘无故给拦了吧?费性能) Bean 的 method 是被代理的 在 Bean 被扫描 ...
- 大数据-业务数据采集-FlinkCDC DebeziumSourceFunction via the 'serverTimezone' configuration property
Caused by: org.apache.kafka.connect.errors.ConnectException: Error reading MySQL variables: The serv ...
- vue 基础学习 一
1. vue 使用快速入门三步走 (1) 新建 HTML 页面,引入 Vue.js文件 <!DOCTYPE html> <html> <head> <meta ...
- Go--命名规则
在Go语言中,项目名和文件名的命名规则有一些建议和惯例.以下是一些常见的规则和最佳实践: 项目名: 项目名应该简短.有意义,并能够清晰地表达项目的目的或功能. 项目名通常使用小写字母,使用连字符或下划 ...
- .NET 6 整合 Autofac 依赖注入容器
前言 一行业务代码还没写,框架代码一大堆,不利于学习. 常看到java的学习资料或博客,标题一般为<SpringBoot 整合 XXX>,所以仿照着写了<.NET 6 整合 Auto ...
- JSP 学习笔记 | 二、JSP 脚本 & 案例实现 & 缺点分析
前文:JSP 学习笔记 | 一.JSP 原理理解 JSP脚本用于在 JSP页面内定义 Java代码.很多入门案例中我们就在 JSP 页面定义的 Java 代码就是 JSP 脚本. JSP 脚本分类 J ...