2015-06-24 3 views
1

EDIT: переустроенном в использовании раунда, который возвращает поплавокПреобразование числа в строку, а затем сравнивая в PHP

Я Конвертирование я округление числа до 2 знаков после запятой, используя круглую функцию

Моего вопрос об этой линии кода ниже:

Могут ли быть ошибки округления или неожиданного поведения, которые могут привести к тому, что это условие будет истинным, когда это не должно быть?

if ($cc_amount > $total) 

ПОЛНЫЙ КОД:

$cc_amount = round($this->sale_lib->get_payment_total('credit'),2); 
    $total = round($this->sale_lib->get_total(),2); 

    //Since they are floats could there be rounding errors? 
    if ($cc_amount > $total) 
    { 
     $this->_reload(array('error' => 'Credit card payment is greater than total'); 
    } 
+1

Почему бы вам просто не сравнить цифры как цифры? –

+0

Почему не просто '$ rounded = round ($ num, 2)'? форматирование в строку, а затем регулярное выражение неэффективно. и считайте, что в качестве строк '' 9 '<' 12'' является ложным, если вы делаете что-то неправильно. –

+0

Если вы обеспокоены округлением, вы можете раунд на лету: 'if (round ($ cc_amount, 2)> round ($ total, 2))' – kainaw

ответ

0

Это немного сбивает с толку относительно того, что вы делаете.

При сравнении строк он может захватить код ASCII каждого персонажа и сравнить их по одному из крайнего левого символа вправо так, что-то вроде 823> 2015.

Если бы я был сравнивать я бы держать их в числовом формате и рассчитать каждую сумму, приведенную примерно так.

function to_decimals($number, $decimals = 2) 
{ 
    if (is_numeric($number)) 
    { 
     $updown = (10^$decimals) 
     return round(($number * $updown))/$updown; 
    } 
    else 
    { 
     return -999999; 
    } 
} 
+0

Мне интересно, будет ли PHP сравнивать их как числа, даже если они являются строками. –

+0

@ChrisMuench: Почему бы вам не сделать простые тесты, чтобы быть уверенными? –

+0

Кажется, все нормально. Меня больше беспокоит, сравниваются ли поплавки, может получиться ошибка округления и привести к неправильным данным. –