JS中的数学计算

栏目: JavaScript · 发布时间: 5年前

内容简介:在数学中 0.1 + 0.2 等于 0.3。什么是容差?在PS中,用来选择色彩颜色类似区域的魔棒工具有一个特别重要的属性叫容差,容差控制其近似程度,容差值越大,所选的区域越大,容差值越小,所选的区域越小。

在数学中 0.1 + 0.2 等于 0.3。

0.1 + 0.2 === 0.3

但是在JS中这个是错误的

JS中的数学计算

why

JavaScript 里的数字的数据类型是 Number,整数和浮点数都是采用 IEEE 754 标准的 64 位双精度浮点数形式存储的。

JS在编译时会将 0.1 和 0.2 转换为二进制,在变为二进制时浮点小数时不精确的,浮点数用二进制表达时是无穷的, IEEE 754 标准 的 64 位双精度浮点数的小数部分最多支持 53 位二进制位,所以它们相加后再转换为十进制结果为:0.30000000000000004。

JS中的数学计算

解决方式

使用容差。

什么是容差?

在PS中,用来选择色彩颜色类似区域的魔棒 工具 有一个特别重要的属性叫容差,容差控制其近似程度,容差值越大,所选的区域越大,容差值越小,所选的区域越小。

可以接受的最常见的做法是使用一个很小的“错误舍入”值作为比较的容差。这个很小的值经常被称为“机械极小值(machine epsilon)”,对于 JavaScript 来说这种 number 通常为 2^-52(2.220446049250313e-16)。

ES6中,可以使用 Number.EPSILON,为了兼容前 ES6 的浏览器,可以使用以下方法简单实现这个功能。

if (!Number.EPSILON) {
	Number.EPSILON = Math.pow(2,-52);
}

现在可以使用 Number.EPSILON 来比较两个数是否相等。

function numbersCloseEnoughToEqual(n1,n2) {
	return Math.abs( n1 - n2 ) < Number.EPSILON;
}

var a = 0.1 + 0.2;
var b = 0.3;

numbersCloseEnoughToEqual( a, b );					// true
numbersCloseEnoughToEqual( 0.0000001, 0.0000002 );	// false

去掉小数点

这个方法有点牵强,属于 人类战略性欺骗 。但是只要达到目的,何乐而不为。

简单的小数点相加,思路就是将小数点去掉再进行计算,并将小数点的位数记下来。

// 来自网络上的大佬
function add(x, y) {
  const xLen = (x.toString().split('.')[1] || '').length;
  const yLen = (y.toString().split('.')[1] || '').length;
  const num = Math.pow(10, Math.max(xLen, yLen));
  return (x * num + y * num) / num;
}

简单的小数点相乘,同样也是去掉小数点。

// 来自网络上的大佬
function multiplyDecimal = (m, n) => {
  let len = 0
  let mStr = m.toString()
  let nStr = n.toString()
  try {
    len += mStr.split('.')[1].length
  } catch (f) {}
  try {
    len += nStr.split('.')[1].length
  } catch (f) {}
  return Number(mStr.replace('.', '') * Number(nStr.replace('.', '')) / Math.pow(10, len))
}

你以为整数就不计算错误了吗?

猜猜看 (手动滑稽)

console.log(20190511224538123);
console.log(20190511224538123 === 20190511224538124);

console.log(201905112245381234);

Oop!

JS中的数学计算

why

究其原因则是 JS数字类型

根据 ECMAScript 标准,JavaScript 中只有一种数字类型:基于 IEEE 754 标准的双精度 64 位二进制格式的值(-(2^63 -1) 到 2^63 -1)。而其中只有 +/- (2^53 -1) 才能正确的表示整数。

2^53 -1 = 9,007,199,254,740,991

在这个 +/- (2^53 -1) 范围以内,称之为 安全整数范围

ES6 中 Number.MAX_SAFE_INTEGER 常量表示在 JavaScript 中最大的安全整数(maxinum safe integer)(2^53 - 1)。

同样的 Number.MIN_SAFE_INTEGER 代表在 JavaScript中最小的安全的integer型数字 (-(2^53 - 1)).


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

平台战略

平台战略

陈威如、余卓轩 / 中信出版社 / 2013-1 / 58.00元

《平台战略:正在席卷全球的商业模式革命》内容简介:平台商业模式的精髓,在于打造一个完善的、成长潜能强大的“生态圈”。它拥有独树一帜的精密规范和机制系统,能有效激励多方群体之间互动,达成平台企业的愿景。纵观全球许多重新定义产业架构的企业,我们往往就会发现它们成功的关键——建立起良好的“平台生态圈”,连接两个以上群体,弯曲、打碎了既有的产业链。 平台生态圈里的一方群体,一旦因为需求增加而壮大,另......一起来看看 《平台战略》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

html转js在线工具
html转js在线工具

html转js在线工具