douduidui1046 2018-03-07 07:19
浏览 170
已采纳

从float转换为int时的舍入错误

We have an API that returns prices as string in EUR, e.g. 2.55 or 0.035. Our database however saves this in cents, so I wrote a really simple method to transform this into cents by just doing

$cents = (int) ((float) $value['value']['amount'] * 100)

So for this code

echo (int) ((float) '2.55' * 100);

the result should be 255, right? But somehow, it's 254. You can test this on your CLI by simply doing

php -r "echo (int) ((float) '2.55' * 100);"

When I get the result of (float) '2.55' * 100) it's simply 255, and when I cast this to int it's 255, why isn't it the same if I cast it to int in the same call?

I mean, I could simply do '2.55' * 100 and the php casting would calculate this correctly, but I'm still curious why this happens?

Version:

PHP 7.1.15-1+ubuntu16.04.1+deb.sury.org+2 (cli) (built: Mar 6 2018 11:10:13) ( NTS )

  • 写回答

1条回答 默认 最新

  • dongmao4486 2018-03-07 07:24
    关注

    It could be a floating point error.

    In php, a float value like 255 could actually be something like 254.9999991. You can round the value before converting to int.

    echo (int) ( round( (float) '2.55' * 100 ) );
    

    This will result to

    255
    

    From PHP Doc:

    Warning Floating point precision Floating point numbers have limited precision. Although it depends on the system, PHP typically uses the IEEE 754 double precision format, which will give a maximum relative error due to rounding in the order of 1.11e-16. Non elementary arithmetic operations may give larger errors, and, of course, error propagation must be considered when several operations are compounded.

    http://php.net/manual/en/language.types.float.php

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥35 MIMO天线稀疏阵列排布问题
  • ¥60 用visual studio编写程序,利用间接平差求解水准网
  • ¥15 Llama如何调用shell或者Python
  • ¥20 谁能帮我挨个解读这个php语言编的代码什么意思?
  • ¥15 win10权限管理,限制普通用户使用删除功能
  • ¥15 minnio内存占用过大,内存没被回收(Windows环境)
  • ¥65 抖音咸鱼付款链接转码支付宝
  • ¥15 ubuntu22.04上安装ursim-3.15.8.106339遇到的问题
  • ¥15 blast算法(相关搜索:数据库)
  • ¥15 请问有人会紧聚焦相关的matlab知识嘛?