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)).


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

查看所有标签

猜你喜欢:

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

ggplot2:数据分析与图形艺术

ggplot2:数据分析与图形艺术

哈德利·威克姆 (Hadley Wickham) / 统计之都 / 西安交通大学出版社 / 2013-5-1 / CNY 46.00

中译本序 每当我们看到一个新的软件,第一反应会是:为什么又要发明一个新软件?ggplot2是R世界里相对还比较年轻的一个包,在它之前,官方R已经有自己的基础图形系统(graphics包)和网格图形系统(grid包),并且Deepayan Sarkar也开发了lattice包,看起来R的世界对图形的支持已经足够强大了。那么我们不禁要问,为什么还要发明一套新的系统? 设计理念 打个比......一起来看看 《ggplot2:数据分析与图形艺术》 这本书的介绍吧!

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

在线压缩/解压 CSS 代码

MD5 加密
MD5 加密

MD5 加密工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具