Подтвердить что ты не робот

Хранение денежных сумм в mysql

Я хочу хранить 3.50 в таблице mysql. У меня есть float, в котором я храню его, но он хранится как 3.5, а не 3.50. Как я могу заставить его иметь нулевой ноль?

4b9b3361

Ответ 1

Не храните денежные значения как float, используйте тип DECIMAL или NUMERIC:

Документация для числовых типов MySQL

ИЗМЕНИТЬ и уточнить:

Значения Float уязвимы для ошибок округления, поскольку они имеют ограниченную точность, поэтому, если вам все равно, что вы получаете только 9.99 вместо 10.00, вы должны использовать DECIMAL/NUMERIC, поскольку они являются номерами с фиксированной точкой, которые не имеют таких проблем.

Ответ 2

Как правило, неплохо хранить деньги как float, поскольку ошибки округления могут возникать в вычислениях.

Вместо этого используйте DECIMAL (10,2).

Ответ 3

Действительно ли это имеет значение, если он хранится как 3,5, 3,50 или даже 3,500?

Что действительно важно, так это то, как он отображается после того, как он извлекается из db.

Или я что-то пропустил?

Также не используйте float, используйте десятичный знак. Float имеет все виды округления и не очень большой.

Ответ 4

Чтобы сохранить значения, вы можете использовать поле DECIMAL (10,2), тогда вы можете использовать FORMAT:

SELECT FORMAT(`price`, 2) FROM `table` WHERE 1 = 1

Ответ 5

Если вы используете типы DECIMAL или NUMERIC, вы можете объявить их как, например, DECIMAL (18, 2), которые заставили бы 2 десятичных знака, даже если они равны 0. В зависимости от того, насколько большие значения вы ожидаете, вы можете изменить значение первого параметр.

Ответ 6

Почему вы хотите хранить "3.50" в своей базе данных? 3.5 == 3.50 == 3.5000 в отношении базы данных.

Ваша презентация и форматирование цифр/дат/и т.д. должна выполняться в приложении, а не в базе данных.

Ответ 7

Binary не может точно представлять плавающие точки только с ограниченным количеством бит. Это не так много потерь данных, но на самом деле ошибки преобразования. Здесь приведены примеры руководства

Вы можете увидеть это в действии в своем браузере, убедитесь сами в этом фрагменте кода.

<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 &pound; instead of pence, we can divide by 100 (presentation only) : &pound;" + intSum/100 + "<br />");
</script>