В базе все числа хранятся в полях DECIMAL(16,4)
Например мне нужно посчиать сумму транзакций, например
Код: Выделить всё
SELECT SUM(amount) AS total FROM tbl_transactions
В php делаю
Код: Выделить всё
$sum = $row['total'] - 130
где я ошибся =)
Код: Выделить всё
SELECT SUM(amount) AS total FROM tbl_transactions
Код: Выделить всё
$sum = $row['total'] - 130
Числа с плавающей точкой имеют ограниченную точность. Хотя это зависит от операционной системы, в PHP обычно используется формат двойной точности IEEE 754, дающий максимальную относительную ошибку округления порядка 1.11e-16. Неэлементарные арифметические операции могут давать большие ошибки, и, разумеется, необходимо принимать во внимание распространение ошибок при совместном использовании нескольких операций.
Кроме того, рациональные числа, которые могут быть точно представлены в виде чисел с плавающей точкой с основанием 10, например, 0.1 или 0.7, не имеют точного внутреннего представления в качестве чисел с плавающей точкой с основанием 2, вне зависимости от размера мантиссы. Поэтому они и не могут быть преобразованы в их внутреннюю двоичную форму без небольшой потери точности. Это может привести к неожиданным результатам: например, floor((0.1+0.7)*10) скорее всего вернет 7 вместо ожидаемого 8, так как результат внутреннего представления будет чем-то вроде 7.9999999999999991118....
Так что никогда не доверяйте точности чисел с плавающей точкой до последней цифры, и не проверяйте напрямую их равенство. Если вам действительно необходима высокая точность, используйте математические функции произвольной точности и gmp-функции.
"Простое" объяснение можно найти в » руководстве по числам с плавающей точкой, которое также называется "Why don’t my numbers add up?" ("Почему мои числа не складываются?")
Код: Выделить всё
$x = 130.6 - 130;
print $x . '<br>';
$x = bcsub('130.6', '130', 2);
print $x;
да, спасибо, как раз почитал про них из поста выше и начал использовать. Стало считаться все хорошо, осталось решить проблему округления.
что за бред? нет вашей или чужой пользы. есть исключительно правило округления, заданное бизнесом.vitovt писал(а): ↑2017.03.10, 17:02Стало считаться все хорошо, осталось решить проблему округления.
Когда я использую стандартные функции округления, результат чаще всего не в мою пользу. Например я получаю цифру 0.035796833333333
если округлять ее - на выходе будет или 0.036 или в худшем случае 0.4