2010-03-25 2 views
-1

У меня есть два поля - количество (десятичные (11, 2)) - gift_amount (десятичных (11, 2))Mysql проблема с десятичной

Когда я сделать обновление на либо для значения, равного или ниже 999,99, он корректно сохраняется.

Однако, если я иду через это, то он падает значение обратно вниз 1 - 10.

Это известная проблема, или я буду неправильно используя десятичную?

Heres некоторые PHP код, что я делаю только, чтобы сделать его более ясным (хотя я на 100% его не ошибка в PHP.

if ($total_balance >= $cost) { 

     if ($this->user->balance->gift_amount > 0) { 
      $total_to_be_paid     = number_format($cost, 2) - number_format($this->user->balance->gift_amount, 2);//figure out how much is left after the gift total 
      $this->user->balance->gift_amount -= number_format($cost, 2); //deduct from the gift balance 
      $this->user->balance->gift_amount = (number_format($this->user->balance->gift_amount, 2) < 0) ? number_format(00.00, 2) : number_format($this->user->balance->gift_amount, 2); //if the gift balance went below 0, lets set it to 0 

      if ($total_to_be_paid > 0) { 
       $this->user->balance->amount = number_format($this->user->balance->amount, 2) - number_format($total_to_be_paid, 2); 
      } 

     } else { 
      $this->user->balance->amount = number_format($this->user->balance->amount, 2) - number_format($cost, 2); 
     } 

     if ($object = Model_ClipBought::create(array('clip_id' => $clip->id, 'user_id' => $this->user->id, 'currency_name' => $user_currency, 'cost' => $cost, 'downloads' => $clip->downloads, 'expires' => time() + ($clip->expires * 86400)))) { 
      $this->user->balance->save(); 
      $download = new Model_Download(ROOT_PATH."/public/files/Clip/$clip->file_url"); 
      $download->execute(); 
     } else { 
      throw new exception('We could not finish the purchase, this has been reported, sorry for the inconvenience.'); 
     } 
    } else { 
     throw new exception('You dont have enough money in your account todo this'); 
    } 

    exit; 
} 
+0

Я очень сомневаюсь, что «десятичный» - это то, что не так с этим кодом. Пожалуйста, уменьшите код до минимального примера, желательно того, который соответствует тегам «mysql» и «decimal». – lexu

+0

Исправлено: number_format (value, 2, '.', '') Не нужно проголосовать за меня, хотя чувак. Спасибо в любом случае – azz0r

ответ

1

Вы не должны использовать number_format, пока не пришло время, чтобы на самом деле выход/отображение номера для пользователя он вставляет вашу систему по умолчанию тысяч Seperator (запятая по умолчанию):.

number_format(999.99, 2) -> 999.99 
number_format(1234.56, 2) -> 1,234.56 

Если использовать эти значения в последующих вычислениях в PHP, или попытаться вставить дословно в MySQL, вы 'll получить funky значения:

2345.67 + 1.0 = 2346.67 

, но с использованием number_format() дает эту последовательность разбора:

number_format(2345.67) + 1.0 -> "2,345.67" + 1.0 
"2,345.67" + 1.0 -> "2" + 1.0 
2 + 1.0 -> 3 

Обратите внимание, как «2,345.67» был усечен до просто «2» - запятая превратит ваш красивый номер в строку, и теперь вы связаны строковыми правилами синтаксического анализа, которые отбрасывают все после первого нечислового символа в строке.

Если вы пытаетесь сохранить все до двух знаков после запятой в течение всей последовательности вычислений, вместо этого используйте вместо этого sprintf('%0.2f', $value).

Смежные вопросы