Округление: баг, фича или ... ?

StUV

Rotaredom
Округление: баг, фича или ... ?

В чем секрет работы вот такого скрипта:
PHP:
<?php
 for ($i=0; $i<9; $i++)
 	echo (int)(10*(0.1+$i/10.0));
?>
результат:

123456779

Спасибо.
 

fixxxer

К.О.
Партнер клуба
PHP:
<?php  
error_reporting(E_ALL);
for ($i=0; $i<9; $i++) {
$r=(10*(0.1+$i/10.0));                           
$r1=(int)$r;  
$r2 = intval($r);
echo "$r $r1 $r2 |";
}
?>
на *nix получаем:
1 1 1 |2 2 2 |3 3 3 |4 4 4 |5 5 5 |6 6 6 |7 7 7 |8 7 7 |9 9 9 |

На винде PHP 4.3.1 при попытке юзать (int) выдает Parse error: parse error, unexpected T_INT_CAST

так что видимо округление.
 

StUV

Rotaredom
аналогично
(win2000prof, php 4.3.2)

p.s.: но никаких ошибок не выдает
 

Altex

Новичок
Всё очень просто, господа
<?

printf("%1.32f",0.1+0.7);

?>
-------------------------------------------------------------------------
А вот решается всё это вот так -
<?php
for ($i=0; $i<9; $i++)
echo (int)(10*(0.1)+10*($i/10.0));
?>
 

young

Новичок
Есть более яркая проблема

PHP:
<?php 
$r=(10*(0.1 + 0.7));
$r1=(int)$r;   
var_dump($r);
var_dump($r1);
?>
float(8) int(7)

PHP:
<?php 
$r=(10*(0.8));
$r1=(int)$r;   
var_dump($r);
var_dump($r1);
?>
float(8) int(8)
 

StUV

Rotaredom
собственно я наткнулся на проблему (int)(10*(0.1+0.7)) в какой-то книге по ПХП - там это представлялось как глюк приведения к целому (с советом стараться так не делать), странно, что глюк возникает только для 0.8, а в остальных случаях все ОК
какое-то очередное "магическое" число ? :)

2Altex: это не выход - если в промежуточных вычислениях где-нить возникнет такой оборот, то будет достаточно сложно его "локализовать"
 
Сверху