parseInt(0.1+0.2-0.3)=5的分析
2018-5-9
| 2024-10-1
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password

问题来源

  • 前几天周会的时候有同事分享了parseInt(0.1+0.2-0.3) = 5的奇怪现象;
  • 然而没有人(含分享者~.~)能准确说上来为什么会出现这种情况(虽然猜测是因为parseInt的第一个参数为string);
  • 所以抽时间根据W3C对parseInt的定义,分析了一下出现这种情况的原因;

执行过程

首先计算值

  1. 因为精度丢失问题:0.1+0.2 = 0.30000000000000004
  1. 再减去0.3就变成了科学计数法表示的小数:5.551115123125783e-17

之后再看parseInt的过程

  1. 执行ToString(string):(0.1+0.2-0.3).toString() => 5.551115123125783e-17;
  1. 创建一个字符串S,转换上一步从第一个非零开始到结尾的值:S="5.551115123125783e-17";
  1. 解析S的符号,这一步的结果不变:S=5.551115123125783e-17;
  1. 创建一个Number值R=ToInteger(radix) ,因为radix默认为10,所以R=10;
  1. 如果 S 包含任何不是 R进制 数位的字符,则令 Z 为 S 中这样的字符之前的所有字符组成的子字符串;否则令 Z 为 S;
  1. 此时,待解析字符串为Z="5.551115123125783";
  1. 后续的转化结果就显而易见了;

结论

  • 从上边的分析过程来看,这个结果是正常的,符合W3C规范对parseInt的定义;

参考资料

  • 开发
  • React学习笔记-01文字转图片性能优化-多进程
    Loading...