Author Topic: Фокус с математикой в PHP  (Read 4762 times)

0 Members and 1 Guest are viewing this topic.

Offline SlyF0X

  • Newbie
  • *
  • Posts: 41
  • Karma: +0/-0
Фокус с математикой в PHP
« on: January 31, 2007, 14:24:14 »
Случайно наткнулся можете проверить сами
<?php
if ( (int)(4.06*100)==405 )
{echo '406=405 ;-)';}
?>

Offline never hood

  • Hero Member
  • *****
  • Posts: 845
  • Karma: +16/-10
  • www.4job.co
    • Работа, которую ты искал
Фокус с математикой в PHP
« Reply #1 on: January 31, 2007, 15:14:07 »
Quote from: SlyF0X
Случайно наткнулся можете проверить сами
<?php
if ( (int)(4.06*100)==405 )
{echo '406=405 ;-)';}
?>
Читаем мануал, где написано:
Code: [Select]
Довольно часто простые десятичные дроби вроде 0.1 или 0.7 не могут быть преобразованы в свои внутренние двоичные аналоги без небольшой потери точности. Это может привести к неожиданным результатам: например, floor((0.1+0.7)*10) скорее всего возвратит 7 вместо ожидаемой 8 как результат внутреннего представления числа, являющегося в действительности чем-то вроде 7.9999999999....

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

Так что никогда не доверяйте точности последних цифр в результатах с числами с плавающей точкой и никогда не проверяйте их на равенство. Если вам действительно необходима высокая точность, вам следует использовать математические функции произвольной точности или gmp-функции.
Из language.types.float.html#warn.float-precision

Offline SlyF0X

  • Newbie
  • *
  • Posts: 41
  • Karma: +0/-0
Фокус с математикой в PHP
« Reply #2 on: January 31, 2007, 22:47:29 »
По поводу сабжа ,я такие фишки еще на с++ встречал.
Это что за мануал у тебя такой ? да еще и на русском, выложи куда-нибудь пожалуста.
« Last Edit: January 31, 2007, 22:50:52 by SlyF0X »

Offline never hood

  • Hero Member
  • *****
  • Posts: 845
  • Karma: +16/-10
  • www.4job.co
    • Работа, которую ты искал
Фокус с математикой в PHP
« Reply #3 on: January 31, 2007, 23:02:43 »
Quote from: SlyF0X
По поводу сабжа ,я такие фишки еще на с++ встречал.
PHP  в этом не оригинален...
Quote
Это что за мануал у тебя такой ? да еще и на русском, выложи куда-нибудь пожалуста.
Обычный ман на PHP в виде россыпи html-файлов, не самый свежий.
php_manual_ru.tar.gz - 2588KB
поищи по названию файла в Тонете, не найдешь - завтра посуетимся.

Offline nuclight

  • Full Member
  • ***
  • Posts: 207
  • Karma: +1/-2
    • http://antigreen.org
Фокус с математикой в PHP
« Reply #4 on: February 01, 2007, 11:17:36 »
Ну, здесь-то обычная точность вычислений с плавающей точкой. Их в любом языке надо сравнивать не точно, а с дельтой, если только тип не хранится внутри в десятичном формате или длинной арифметикой. Но в php и других приколов хватает, вот, например:
Code: [Select]
<?php
setlocale(LC_ALL,"ru_RU.KOI8-R");
echo (float)(string)(float)"1.5";
?>
Еще можно ознакомиться с http://hostel.avtf.net/~vadim/phpbastard.html
WBR, Nuclear Lightning
[FreeBSD][Давить зелёных]