Разрушительное литье? - PullRequest
       14

Разрушительное литье?

1 голос
/ 10 января 2011

В PHP я знаю, что мы не должны делать math на плавающих объектах без таких вещей, как bcmath, но разве просто приведение строки к плавающему разрушительна?

Будут ли выражения типа (float)'5.111' == '5.111' всегда быть правдой? Или сам актерский состав изменит это на что-то вроде 5.1110000000000199837 при преобразовании числа?

Основная причина в том, что, поскольку я использую (int) для экранирования целочисленных значений, поступающих в базу данных, я хотел бы использовать (float) таким же образом, не полагаясь на кавычки и мою escape-функцию. *

Ответы [ 3 ]

1 голос
/ 10 января 2011

Это зависит от того, может ли дробная часть быть представлена ​​в двоичном виде (см. Дробные дроби ). Например, 0.5 имеет точное двоичное представление, а 0.1 - нет. Если число не имеет точного представления, вы можете увидеть другой результат при повторной печати. ​​

1 голос
/ 10 января 2011

NO , приведение к плавающей точке почти всегда деструктивно.

В вашем примере, 5.111 в двоичном виде:

101.00011100011010100111111011111001110110110010001011010000111001...

Число с плавающей запятой будет хранить 23 цифры:

101.0001110001101010011 
(5.1109981536865234375)

Двойник будет хранить 52 цифры:

101.0001110001101010011111101111100111011011001000101
(5.1109999999999988773424774990417063236236572265625)

В этом случае разницы не будет.Однако в больших количествах это может повлиять на то, что вы отображаете.

Например:

1025.4995

double:

10000000001.011111111101111100111011011001000101101
(1025.499499999999898136593401432037353515625)

float:

10000000001.011111111101
(1025.499267578125)

Вы можете видеть, что точность начинает резко падать примерно после 8 цифр.

Двойное число округляется до 1025.4995 , тогда как значение с плавающей точкой будет 1025.4993

1 голос
/ 10 января 2011

Вы не должны использовать (int) для экранирования целочисленных значений. Используйте параметризованный запрос и установите тип вашего ввода 'int'. Гораздо лучший способ!

для примера в mysql / php смотрите: http://us.php.net/manual/en/mysqli.prepare.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...