|
|
|
| Есть код:
<?php
$L = 150.2;
// Рассчитываем перменную
$t = ($L*100 - intval($L)*100);
var_dump($t);
echo '<br>';
echo intval($t);
echo '<br>';
// Просто задаем занчение
$t = (float)20;
var_dump($t);
echo '<br>';
echo intval($t);
?>
|
Это код выдает следующее:
float(20)
19
float(20)
20
Вопрос:
Почему в первом случае делается 19, а во вотором 20?
И как с этим боросться? | |
|
|
|
|
|
|
|
для: tAleks
(26.08.2008 в 14:53)
| |
printf("L = %.20g , t = %.20g, ", $L, $t);
|
150.2 непредставимо точно в двоичной системе. 10010110.(001) | |
|
|
|
|
|
|
|
для: Trianon
(26.08.2008 в 15:14)
| | Я не очень в этом понимаю, можно чуть подробнее?
И как в данной ситуации это побороть? Чтобы 20-ка оставалась двадцаткой? | |
|
|
|
|
|
|
|
для: tAleks
(26.08.2008 в 15:18)
| | Двадцатка окажется двадцаткой.
а вот целая часть от 19.9 равна 19.
А как бороть, зависит от того, что Вы рассчитываете.
Вслепую этого не поймешь. | |
|
|
|
|
|
|
|
для: Trianon
(26.08.2008 в 15:20)
| | а почему var_dump() в первом случае не выдает 19.9, а 20? | |
|
|
|
|
|
|
|
для: tAleks
(26.08.2008 в 15:26)
| | А она его округляет. До разумной точности. Где-то до 15 знака после запятой... по честным правилам округления. то есть от пятерки и выше - вверх.
intval же - отбрасывает. Наплевав, что там за цифры.
А если Вы про 20 - то 20 представляется точно: 10100 | |
|
|
|
|
|
|
|
для: tAleks
(26.08.2008 в 15:18)
| | echo gettype($t); - увидите. Уберите intval перед выводом результата получите 20. | |
|
|
|