2012-04-09 1 views
1

У меня есть две переменные float, которые равны, я получаю их с помощью PHP и вычитаю их. результат равен (7.105427357601E-15). Я попытался изменить двойное или десятичное значение, и ни одно из них не сработало. Это то, что я использую в PHP:Чтение float из mySQL

$giftcard_balance = $giftcard['balance']; 
$total = $product['price']; 

$total -= $giftcard_balance; 
echo $total; 

Здесь вместо того чтобы показывать 0, он показывает (7.105427357601E-15)

Любой человек может помочь, пожалуйста?

+0

Какие значения обычно существуют? – BenOfTheNorth

+4

Поплавки не являются порядковыми. Они также не могут точно представлять определенные ценности. Вы не можете использовать == для сравнения поплавков или полагаться на вычитание значения из того же значения, приводящего к 0. – GordonM

+1

Какой смысл вытеснять идентичные значения из другого. Результат равен 0. Разница исходит из неточности float –

ответ

1

Чтобы избавиться от неточности поплавка, вы можете, например, использовать форматирование чисел.

$a = 7.105427357601E-15; 
$b = number_format($a, 2); 
echo $a , "\n", $b , "\n"; 
+0

Спасибо, я попробовал number_format и это решило проблему –

0

Возможно, вы ищете php intvalfunction.

Возможно, roundfunction.

+1

intval будет ошибкой как intval ("0.5") = 0 –

3

Когда имеешь дело с ценами и остатки на счетах вы обнаружите, что DECIMAL (6, 2) гораздо легче иметь дело с чем FLOAT. Если у вас возникла такая же проблема при использовании типа данных DECIMAL, отправьте конкретный пример.

Использование round() или аналогичное - очень плохая идея, поскольку она просто маскирует проблему, а не фиксирует ее.

+0

Бывают случаи, когда вы не можете изменить FLOAT на DECIMAL. В таких случаях округление до 2,4,6 и т. Д. Может быть спасателем жизни, в основном, если оно представляет собой деньги. –

+1

@AttilaFulop - Это не спасатель жизни, это ошибка, ожидающая возвращения своей уродливой головы! Ошибки дизайна маскировки, подобные этому, никогда не являются хорошей идеей. Если ошибка была сделана в оригинальной конструкции, и это связано с затратами на ее фиксацию, то владельцы пакетов должны быть осведомлены о возможных последствиях не исправления. Это битва, которую можно почти всегда выиграть. Я был в этой и подобных ситуациях не один раз. – nnichols

+0

Как бы вы решили, если у вас есть интернет-магазин Magento? Это сохраняет эти значения как FLOAT. Если я изменю FLOAT на DECIMAL, я сломаю Magento. Так что, я думаю, остается только решить его с php. Есть ли лучшее решение, чем округление с достаточно большой точностью? –