Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

浮点数的精度与转换

  JavaScript使用64位IEEE754浮点数来储存数字,而64位IEEE754浮点数的尾数部分只有52位。这意味着虽然使用IEEE754可以表示更巨大的数字,但是精度只有52位。如果用它储存精确整数的话,最大只能存到9007199254740992,再大的数字就无法精确了。
  下面这就是一个典型的测试 <script>
alert(9007199254740992==9007199254740993); //true
</script>
  64位的IEE754无法表示9007199254740993这个数字,因为这个数字转换成二进制以后末尾的1落在第53位上,而精度只有52位,所以最后一位就被舍去了。这就导致了它与9007199254740992相等。
  这里还有另一个问题,我们输出结构基本都是采用字符串的形式,而toString本身对数字的精度是有损耗的。因为toString是使用类似toPrecision的算法。这就导致了我们通常只能看到16位的十进制,多余的十进制位会被近似掉。但是有一些特殊的数字,虽然超出了精度范围,但是超出部分的尾数本来就是0。比如要精确表示2的64次方,我们就不能使用toString,应该使用toFixed<script>
alert(Math.pow(2,64).toString()); //只精确到16位
alert(Math.pow(2,64).toFixed()); //精确显示19位,但IE上存在BUG
</script>
  也不是说toFixed就永远比toString的精度高,他们的区别是toFixed是从二进制上对数字近似,而toString是在十进制上对数字近似。只有在表示2的n次方这种特殊情况时toFixed才比toString精度高,其它情况下他们都是不精确的,无法比较高低。
网名:
54.224.247.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^