原来 0.1*0.2!=0.02

今天老大一本正经的跟我说要交给我一个重大任务。解决关于0.1*0.2的问题。

0.1*0.2不就等于0.02吗??!!一个小学生都知道的答案,但是程序告诉你0.1*0.2并不是0.02。

事实上,不仅仅是 JS,在其他采用 IEEE754 浮点数标准的语言中,0.1 * 0.2 都不会等于 0.02,0.1+0.2也不会等于0.3,就是这样。

如果以后有人问你0.1+0.2 等于多少,0.1*0.2等于多少可别被坑了,就是这么神奇。

更神奇的是,9007199254740992+1=9007199254740992

  

为什么0.1*0.2 不等于0.02呢 0.1+0.2不等于0.3呢,这并不是因为程序出bug 了,因为他在做浮点数学。电脑只能本地存储整数,所以他们需要一些表示十进制数的方法。 这种表示带有一定程度的不准确性。 这就是为什么0.1 + 0.2!= 0.3。

首先我们先来了解一下什么是IEEE标准754浮点数

这个我就不多说了,您请自己看,我说的也没它好。

IEEE Standard 754 Floating Point Numbers

Floating-point arithmetic

现在让我们来看关于 0.1,0.2,0.3,它的二进制表示

0.1D=   2^-3 * 0.11001100110011001100110011001100110011001100110011010
0.2D=   2^-2 * 0.11001100110011001100110011001100110011001100110011010
0.3D=   2^-1 * 0.10011001100110011001111001100110011001100110011001100

我是在ionic2 项目中通过npm install了double-bits 和 pad

然后ts 文件里这样写

import { Component } from ‘@angular/core‘;
import * as db from ‘double-bits‘;
import * as pad from ‘pad‘;

@Component({
  selector: ‘page-double-bits‘,
  templateUrl: ‘double-bits.html‘,
})
export class DoubleBits {

  constructor() {
    console.log("0.1D=   " + this.base2Str(0.1));
    console.log("0.2D=   " + this.base2Str(0.2));
    console.log("0.3D=   " + this.base2Str(0.3));
  }

  base2Str(n) {
    var f = db.fraction(n)
    return (db.sign(n) ? "-" : "") +
      "2^" + (db.exponent(n) + 1) +
      " * 0." + pad(f[1].toString(2), 20, "0") +
      pad(f[0].toString(2), 32, "0")
  }
}

输出:

  0.1100110011001100110011001100110011001100110011001101B
+  1.1001100110011001100110011001100110011001100110011010B
= 10.0110011001100110011001100110011001100110011001100111B

将10.0110011001100110011001100110011001100110011001100111B转化成真值,结果为:0.30000000000000004

所以 0.1+0.2=0.30000000000000004 是这样来的了 。

那么如果我一定要 0.1+0.2=0.3呢

然后我找到了 这个 big.js. 一个小而快速的JavaScript库,用于任意精度的十进制算术。

安装

npm install big

导入项目

import * as Big from ‘big.js‘;

使用

this.tt ="0.1*0.2="+ new Big(0.1).times(0.2);

this.mm="0.1+0.2="+new Big(0.1).add(0.2);

页面显示结果:

ps:

double-bits  pad big-js

How numbers are encoded in JavaScript

揭秘 0.1 + 0.2 != 0.3

时间: 2024-11-05 16:07:22

原来 0.1*0.2!=0.02的相关文章

Atitit..jdk java 各版本新特性 1.0 1.1 1.2 1.3 1.4 1.5(5.0) 1.6(6.0) 7.0 8.0 9.0 attilax 大总结

Atitit..jdk java 各版本新特性 1.0 1.1 1.2 1.3 1.4 1.5(5.0) 1.6(6.0) 7.0 8.0 9.0 attilax 大总结 1.1. Java的编年史2 1.2. Java版本:JDK 1.02 1.3. Java版本:JDK 1.13 1.4. Java版本:JDK 1.2 (Java 2)4 1.4.1. 1999年5 1.4.2. 2000年5 1.5. Java版本:JDK 1.35 1.5.1. 2001年6 1.5.2. 2002年7

Oracle database 11.2.0.3.0 升级至 11.2.0.3.14

下载PSU p20299017_112030_Linux-x86-64(DATABASE PATCH SET UPDATE 11.2.0.3.14 (INCLUDES CPUAPR2015)).zip 及Opatch p6880880_112000_Linux-x86-64(OPatch patch of version 11.2.0.3.10 for Oracle software releases 11..zip 下载地址 http://yunpan.cn/cHACmBerMb526 访问密

Angular 1.0演变Angular 2.0的简单优势列举

首先,Angular最核心的4大特性分别是: 1.模块化 2.MVC 3.双向数据绑定 4.指令 Angular 1.0演变Angular 2.0的简单优势列举: 1.性能限制上的优化 说明:随着时间的推移,各种特性被加入进去以适应不同场景下的应用开发,在最初的架构受到了限制,而Angular 2.0很好的解决了这些问题. 2.仿照WEB后端的结构模式来编写前端 说明:支持模块.类.lambda表达式. generator等新的特性 3.支持移动端开发 说明:Angular1.x没有针对移动 应

c# .net 3.5 4.0 4.5 5.0 6.0各个版本新特性战略规划总结【转载】

引用:http://blog.csdn.net/attilax/article/details/42014327 c# .net 3.5 4.0 各个版本新特性战略规划总结 1. --------------.Net Framework版本同CLR版本的关系1 2. paip.------------SDK2.0功能-------------2 2.1. 泛型:2 3. --------------sdk3.0  增加了以下功能..2 3.1. LINQ 3 4.  ----------sdk4

React v15.5.0更新说明 & v16.0.0更新预告

React今日发布了15.5.0版本,同时这也将是以15开头的最后一个版本,下一次发布,我们将迎来React 16.0.0 在15.5.0这一版本中,主要有以下两处改动: 独立React.PropTypes 在之前的版本之中,我们可以通过React.PropTypes这个API访问React内置的一些类型来检查props,在15.5.0版本中,这一API被独立成了一个新的包 prop-types // 15.4 以前 import React from 'react'; class Compon

System.Web.Mvc 3.0.0.1 和 3.0.0.0 有什么区别?被 Microsoft ASP.NET MVC 的一次安全更新害惨了!!!

今天更新站点时,发现网站竟然报错 ... uses 'System.Web.Mvc, Version=3.0.0.1, Culture=neutral, PublicKeyToken=31bf3856ad364e35' which has a higher version than referenced assembly 'System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' 最终发现

csharp:using Newtonsoft.Json.Net2.0 in .net 2.0 webform

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86

安装HBase 0.94.6-cdh4.3.0

安装HBase 0.94.6-cdh4.3.0 设定HBase的配置文件,由于安装的是cdh版,各版本直接匹配,互相依赖的jar包也都正确,只需要配置下hbase的环境变量和配置文件即可. 1.配置hbase-env.sh,添加JAVA_HOME环境变量 [html] view plaincopy export JAVA_HOME=/usr/java/default/  其他暂时不用添加 export HBASE_MANAGES_ZK=true 2.修改hbase-site.xml,如下配置 [

ASP.NET Thread Usage on IIS 7.5, IIS 7.0, and IIS 6.0

I’d like to briefly explain how ASP.NET uses threads when hosted on IIS 7.5, IIS 7.0 and IIS 6.0, as well as the configuration changes that you can make to alter the defaults. Please take a quick look at the “Threading Explained” section in Chapter 6

Atitit.  c# 语法新特性 c#2.0 3.0 4.0 4.5 5.0 6.0   attilax总结

Atitit.  c# 语法新特性 c#2.0 3.0 4.0 4.5 5.0 6.0   attilax总结 1.1. C# 1.0-纯粹的面向对象 1.2. C# 2.0-泛型编程新概念 1.3. C# 2.0的另一个突出的特性就是匿名方法 1.4. C#3.0 linq 1.5. C# 4.0动态编程 dynamic 1.6. C# 4.5 异步编程 async和await 1.7. C# 5.0 更方便的一步编程 1.8. C# 6.0 中的新特性 作者:: 绰号:老哇的爪子 ( 全名: