округление :)

skAmZ
На сайте с 04.09.2009
Offline
122
724


for($i=2083.90;$i<2084;$i+=0.01){
echo $i.' - '.floor($i*100).'<br>';
}
echo '<hr/>';
echo '2083.95 - '.floor(2083.95*100).'<br>';
echo '2083.93 - '.floor(2083.93*100).'<br>';

intval аналогично.:confused:

Идеи? :popcorn:

---------- Добавлено 02.03.2012 в 15:03 ----------

Если кому лень проверять:


2083.9 - 208390
2083.91 - 208391
2083.92 - 208392
2083.93 - 208393
2083.94 - 208394
2083.95 - 208395
2083.96 - 208396
2083.97 - 208397
2083.98 - 208398
2083.99 - 208399
--------
2083.95 - 208394
2083.93 - 208392
LEOnidUKG
На сайте с 25.11.2006
Offline
1774
#1

Можно round, только в чём вопрос то ?

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
skAmZ
На сайте с 04.09.2009
Offline
122
#2

LEOnidUKG, можно round. Вопрос, чутка ниже дописал :)

LEOnidUKG
На сайте с 25.11.2006
Offline
1774
#3

ну тогда ceil уж точно.

А вообще конечно интересно, может быть баг? :)

skAmZ
На сайте с 04.09.2009
Offline
122
#4

LEOnidUKG, не о том речь) ceil, round все не то.

Вот она суть вопроса:

floor(2083.95*100) = 208394
LEOnidUKG
На сайте с 25.11.2006
Offline
1774
#5

Я так понял этот же баг в мануалах: http://www.php.net/manual/en/function.floor.php#88197

---------- Добавлено 02.03.2012 в 17:15 ----------

Хотя если так:

<?php

$var=2083.95*100;

echo '2083.95 - '.floor("$var").'<br>';

?>

то всё ок :)

---------- Добавлено 02.03.2012 в 17:16 ----------

Только можно вопрос, зачем там вообще округление?

skAmZ
На сайте с 04.09.2009
Offline
122
#6

LEOnidUKG, цель отсечь все после 2-го знака. Вариант через floor как мне казалось приемлемый: floor($val*100)/100;

round не подходит. Нужно из 1.00999 получить 1.

---------- Добавлено 02.03.2012 в 15:31 ----------

LEOnidUKG, за вариант с кавычками спасибо, попробуем)

---------- Добавлено 02.03.2012 в 15:35 ----------

Но все равно такое безобразное отношение к числам мне не понятно :)

Ёхан Палыч
На сайте с 07.05.2006
Offline
169
#7
skAmZ:
Но все равно такое безобразное отношение к числам мне не понятно

Так вроде это нормально, floor округляет дробь до ближайшего Меньшего целого.

Так как 2083.95*100 дробь, то и округляет в меньшую сторону. Дробь 2083.95*100 меньше целого 208395

<?php

$x=2083.93;
$y=$x*100;
$z=208393;
echo 'X='.$x.'<br>Y=X*100=float '.$y.'<br>Z=int '.$z.'<br>Floor(Y)='.floor($y).'<br>Floor(Z)='.floor($z).'<br>';
if($y==$z){echo "Y и Z равны.";}else{echo "Y и Z не равны.";}
if($y<$z){echo " Y меньше.";}else{echo " Z меньше.";}
?>

Точность числа с плавающей точкой

Довольно часто простые десятичные дроби вроде 0.1 или 0.7 не могут быть преобразованы в свои внутренние двоичные аналоги без небольшой потери точности. Это может привести к неожиданным результатам: например, floor((0.1+0.7)*10) скорее всего возвратит 7 вместо ожидаемой 8 как результат внутреннего представления числа, являющегося в действительности чем-то вроде 7.9999999999....

Это связано с невозможностью точно выразить некоторые дроби в десятичной системе счисления конечным числом цифр. Например, 1/3 в десятичной форме принимает вид 0.3333333. . ..

Так что никогда не доверяйте точности последних цифр в результатах с числами с плавающей точкой и никогда не проверяйте их на равенство. Если вам действительно необходима высокая точность, вам следует использовать математические функции произвольной точности или gmp-функции.
LEOnidUKG
На сайте с 25.11.2006
Offline
1774
#8

Ёхан Палыч, ну я это уже вспомнил, поэтому самый быстрый вариант, это превратить в строчку, а потом уже в нормальное число. Тогда эти "невидимые" дроби отсекутся.

Ёхан Палыч
На сайте с 07.05.2006
Offline
169
#9

LEOnidUKG, ну, да, floor("$var") - преобразование строки в целое (если в строке нет символов "." или "e")

То есть это не есть баг, это фича, которую надо помнить.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий