跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 一个关于数值计算的奇怪问题
未分類
4 2 月 2021

一个关于数值计算的奇怪问题

一个关于数值计算的奇怪问题

資深大佬 : evil4 1

今天在处理一个 BUG 的时候,发现了一个很奇怪的问题,写出来让大家参观一下,可能大家也碰到过类似问题,可以讨论一下解决方法以避免后来的同学踩坑。

问题如下:
intval(157.2*100)

我们直观看的话应该觉得输出 15720,但是他实际输出是 15719

我分别输出 157.2 * 100, 结果 15720
然后 intval(15720) 结果 15720

但是为什么上面这个就会输出 15719 呢?有高手指点一下吗?

大佬有話說 (9)

  • 資深大佬 : carity

    浮点精度问题

  • 資深大佬 : fengpan567

    转成整数进行计算

  • 資深大佬 : joesonw

    参考资料 https://en.wikipedia.org/wiki/IEEE_754

  • 資深大佬 : eastphoton

    日经了。十进制下的有限小数可能是二进制下的无限循环小数,存不了。

    0.2D=0.00110011B 无限循环,从浮点可存储位数截断后变成 0.19xxx

    不允许误差不要用浮点。

  • 資深大佬 : mrgeneral

    > 以十进制能够精确表示的有理数如 0.1 或 0.7,无论有多少尾数都不能被内部所使用的二进制精确表示,因此不能在不丢失一点点精度的情况下转换为二进制的格式。这就会造成混乱的结果:例如,floor((0.1+0.7)*10) 通常会返回 7 而不是预期中的 8,因为该结果内部的表示其实是类似 7.9999999999999991118…。

    如果确实需要更高的精度,应该使用 BC 或者 GMP 。

  • 資深大佬 : debuggerx

    round()

  • 資深大佬 : zhengwenk

    var_dump(157.2 * 100)
    float(15720)

    157.2*100 === 15720
    false

  • 資深大佬 : Jooooooooo

    有些十进制看起来可以表达, 其实二进制表达不了.

  • 資深大佬 : faqqcn

    换成 BC Math 方法。
    bcmul(‘157.2’,100,0)

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具