хранение денежных сумм в mysql
Я хочу сохранить 3.50 в таблицу mysql. У меня есть поплавок, в котором я его храню, но он хранит как 3.5, а не 3.50. Как я могу заставить его иметь трейлинг-ноль?
7 ответов:
Не храните денежные значения в виде float, используйте десятичный или числовой тип:
документация для числовых типов MySQL
редактировать и уточнение:
значения с плавающей запятой уязвимы для ошибок округления, они имеют ограниченную точность, поэтому, если вам все равно, что вы получаете только 9.99 вместо 10.00, вы должны использовать десятичные/числовые числа, поскольку они являются номерами с фиксированной точкой, которые не имеют таких проблем.
обычно не рекомендуется хранить деньги в виде поплавка, так как ошибки округления могут возникать в расчетах.
рассмотрите возможность использования десятичной(10,2) вместо этого.
действительно ли имеет значение, если он хранит как 3.5, 3.50 или даже 3.500?
что действительно важно, так это то, как он отображается после его извлечения из БД.
или я что-то пропустил?
также не используйте поплавок, используйте десятичное число. Поплавок имеет все виды округления проблемы и не очень большой.
Почему вы хотите сохранить "3.50" в вашей базе данных? 3.5 = = 3.50 == 3.5000 что касается базы данных.
ваша презентация и форматирование фигур / дат / и т. д. должны выполняться в приложении, а не в базе данных.
Если вы используете десятичные или числовые типы, вы можете объявить их как, например, десятичные(18, 2), которые заставили бы 2 десятичных знака, даже если они были 0. В зависимости от того, насколько большие значения вы ожидаете, вы можете изменить значение первого параметра.
двоичный код не может точно представлять плавающие точки с ограниченным числом битов. Это не так много потери данных, но на самом деле ошибки преобразования.. вот руководство с примерами
вы можете увидеть это в действии в вашем браузере, смотрите сами в этом фрагменте кода.
<script> var floatSum = 0; // add 0.1 to floatSum 10 times for (var i=0; i<10; i++) { floatSum += 0.1; } // if the repetative adding was correct, the floatSum should be equal to 1 var expectedSum = 10*0.1; // 1 // you can see that floatSum does not equal 1 because of floating point error document.write(expectedSum + " == " + floatSum + " = " + (expectedSum==floatSum) + "<br />"); // --- using integers instead --- // Assume the example above is adding £0.10 ten times to make £1.00 // With integers, we will use store money in pence (100 pence (also written 100p) in £1) var intSum = 0; // add 0.1 to floatSum 10 times for (var i=0; i<10; i++) { intSum += 10; } // if the repetative adding was correct, the floatSum should be equal to 1 var expectedSum = 10*10; // 100 // you can see that floatSum does not equal 1 because of floating point error document.write(expectedSum + " == " + intSum + " = " + (expectedSum==intSum) + "<br />"); document.write("To display as £ instead of pence, we can divide by 100 (presentation only) : £" + intSum/100 + "<br />"); </script>