dpvhv66448 2015-01-21 15:16
浏览 44
已采纳

Float 1有时转换为0,有时为1 [duplicate]

This question already has an answer here:

I am trying to get the first decimal place of a float number as an integer by subtracting the integer part, multiplying the remainder with 10 and then casting the result to int or using intval(). I noticed that the result for numbers with x.1 is correctly 1 as float, but after converting it to integer, it becomes sometimes 0, sometimes 1.

I tried to test it with numbers from 1.1 to 9.1:

for ($number = 1; $number < 10; $number++) {
    $result = 10 * ($number + 0.1 - $number);
    echo "<br/> number = " . ($number + 0.1) . ", result: ";
    var_dump($result);
    $result_int = intval($result);
    var_dump($result_int);
}

Starting with 4.1 as input, the 1 oddly gets converted to 0:

number = 1.1, result: float(1) int(1)
number = 2.1, result: float(1) int(1)
number = 3.1, result: float(1) int(1)
number = 4.1, result: float(1) int(0)
number = 5.1, result: float(1) int(0)
number = 6.1, result: float(1) int(0)
number = 7.1, result: float(1) int(0)
number = 8.1, result: float(1) int(0)
number = 9.1, result: float(1) int(0)  

Why at 4.1? That doesn't make any sense to me. Can anyone give me a hint what I am doing wrong?

PS: also tested at http://ideone.com/hr7M0A

</div>
  • 写回答

2条回答 默认 最新

  • dongtingxiao4697 2015-01-21 15:20
    关注

    You are seeing these results because floating point arithmetic is not perfectly accurate.

    Instead of trying to manually get the first decimal point use fmod:

    $result = substr(fmod($number, 1) * 10, 0, 1)
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 file converter 转换格式失败 报错 Error marking filters as finished,如何解决?
  • ¥15 ubuntu系统下挂载磁盘上执行./提示权限不够
  • ¥15 Arcgis相交分析无法绘制一个或多个图形
  • ¥15 关于#r语言#的问题:差异分析前数据准备,报错Error in data[, sampleName1] : subscript out of bounds请问怎么解决呀以下是全部代码:
  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误
  • ¥30 3天&7天&&15天&销量如何统计同一行