`
阅读更多

【前言】

    本文简单说下JS浮点数表示法(不精确)的解决方法

 

【主体】

    Javascript采用了IEEE-745浮点数表示法,这是一种二进制表示法,可以精确地表示分数,比如1/2,1/8,1/1024。遗憾的是,我们常用的分数都是十进制分数1/10,1/100等,二进制浮点数表示法并不能精确的表示类似0.1这样的简单的数字。所以js浮点数运算会不精准。

    例如:

js加法:9.3+0.3;//结果为9.600000000000001
js加法:9.3-0.7;//结果为8.600000000000001
js乘法:7*0.8;//结果为5.6000000000000005
js除法:9.3/0.3;//结果为31.000000000000004

    解决办法:把浮点数先转换为整数再运算,运算后再对结果转换为小数

 

   我们一般会重写js的四则运算:

//JS加法函数
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
}

//JS减法函数
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乘法函数
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)
}

//JS除法函数
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 (r1/r2)*pow(10,t2-t1);
  }
}

 

 

.

分享到:
评论

相关推荐

    float-regex:正则表达式以匹配javascript表示法中的浮点数

    浮动正则表达式javascript 表示法中真实浮点值的正则表达式: module . exports = / [ -+ ] ? (?: \d * \. ? \d + | \d + \. ? \d * ) (?: [ eE ] [ -+ ] ? \d + ) ? / ; 不匹配: +/- 无穷大NaN例子锚定一个字符串...

    10分钟学会js处理json的常用方法

    JSON 语法是 JavaScript 对象表示法语法的子集。 数据在名称/值对中、数据由逗号分隔、花括号保存对象、方括号保存数组 JSON 值可以是:数字(整数或浮点数)、字符串(在双引号中)、逻辑值(true 或 false)、数组...

    文章目录 一、javaScript 的几种数据类型 1、数字类型 2、字符串 3、布尔型 4、数组 5、null 和 undef

    对于较大或较小的数,JavaScript 还支持科学记数法,如 2e3 表示2000。 对于一般的数学运算,如加减乘除,和数学上的表达方式相同。对于稍微复杂的运算,需要通过 Math 对象定义的函数来实现,下面是一些例子: ...

    c#版json数据解析示例分享

    JSON 语法是 JavaScript 对象表示法语法的子集。 数据在名称/值对中:名称是字符串,使用双引号表示。值可以是:数字(整数或浮点数),字符串(在双引号中),数组(在方括号中),对象(在花括号中),true/false/...

    StringNumber:JSON.parse stringify将大数字转换为字符串

    十进制(可选地,科学的)表示法中的任何浮点数都是有效的JSON值。 序列化可能不符合IEEE 754整数精度的值作为JSON API中的字符串是一个好主意,但是{ "value" : 9223372036854775807}例如仍然是有效的RFC4627 JSON...

    JavaScript数据类型和变量_动力节点Java学院整理

    JavaScript不区分整数和浮点数,统一用Number表示,以下都是合法的Number类型: 123; // 整数123 0.456; // 浮点数0.456 1.2345e3; // 科学计数法表示1.2345x1000,等同于1234.5 -99; // 负数 NaN; // NaN表示Not ...

    JavaScript中各数制转换全面总结

    利用toString的基模式来进行转换: ECMAScript对数字类型的toString描述如下: Number 类型的 toString() 方法比较特殊,它有两种模式,即...注释:在默认模式中,无论最初采用什么表示法声明数字,Number 类型的 toS

    json-bigint:带有bigints支持的JSON.parsestringify

    十进制(可选,科学形式)表示法中的任何浮点数都是有效的JSON值。 在JSON api中将可能不属于IEEE 754整数精度的值序列化为字符串是一个好主意,但是例如, { "value" : 9223372036854775807}仍然是有效的RFC4627 ...

    JavaScript习题(语言结构)

    17. 由关键字表示的运算符有____、____、____、____、____、____。 18. 运算符“+”既可以对数字进行代数求和,也可以对字符串进行连接操作,而它总是把对象转换成可以进行加法运算或者可以进行连接操作的数值或字符...

    微软JavaScript手册

    除法运算符 (/) 对两个表达式执行除法运算。 do...while 语句 先执行一次语句块,然后重复执行该循环,直至条件表达式的值为 false。 E 属性 返回 Euler 常数,即自然对数的底。 encodeURI 方法 将文本字符串...

    javascript文档

    javascript的官方文档 这些方便实用的信息将帮助您了解 JScript 的各个部分。 在“字母顺序的关键字列表”中,可以找到按字母顺序列出的所有 JScript 语言的主题。如果只需要查看某个主题(例如对象),则有对该主题...

    jquery1.9.1中文版

    // JSON RegExp(JavaScript Object Notation:JavaScript对象标记法正则表达式) rvalidchars = /^[\],:{}\s]*$/, rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g...

    正则表达式

    由于某些字符类非常常用,所以JavaScript的正则表达式语法包含一些特殊字符和转义序列来表示这些常用的类.例如, \s 匹配的是空格符,制表符和其它空白符, \s 匹配的则是空白符之外的任何字符. 正则表灰式的字符类 ...

    jquery1.9.1中文汉化版

    // JSON RegExp(JavaScript Object Notation:JavaScript对象标记法正则表达式) rvalidchars = /^[\],:{}\s]*$/, rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/...

    JScript 语言参考

    除法运算符 (/) 对两个表达式执行除法运算。 do...while 语句 先执行一次语句块,然后重复执行该循环,直至条件表达式的值为 false。 E 属性 返回 Euler 常数,即自然对数的底。 encodeURI 方法 将文本字符串...

    整理后java开发全套达内学习笔记(含练习)

    二进制是无法精确的表示 0.1 的。 进行高精度运算可以用java.math包中BigDecimal类中的方法。 自动类型提升又称作隐式类型转换。 强制类型转换:int ti; (byte) ti ; 强制转换,丢弃高位 宣告变量名称的同时...

    十天学会ASP.net--我认为ASP.NET比ASP难很多,希望大家做好准备

    首先来说一下表单的验证控件,以前我们做表单验证,如果是客户端的JAVASCRIPT,不能做到美观统一,而且还可以通过直接在浏览器起教表单来屏蔽;如果我们做服务器端验证,又会发现让检验结果在前台反映也是很麻烦的...

Global site tag (gtag.js) - Google Analytics