在mysql中存储金额

时间:2010-02-12 11:04:25

标签: mysql floating-point currency fixed-point

我想将3.50存储到mysql表中。我有一个存储它的浮动,但它存储为3.5,而不是3.50。如何才能得到尾随零?

7 个答案:

答案 0 :(得分:94)

不要将货币值存储为浮点数,请使用DECIMAL或NUMERIC类型:

Documentation for MySQL Numeric Types

EDIT&澄清:

Float值容易受到舍入错误的影响,因为它们的精度有限,所以除非你不关心你只得到9.99而不是10.00,你应该使用DECIMAL / NUMERIC,因为它们是没有这些问题的定点数。

答案 1 :(得分:36)

将钱存入浮动通常不是一个好主意,因为计算中可能会出现舍入错误。

请考虑使用DECIMAL(10,2)。

答案 2 :(得分:19)

如果它存储为3.5,3.50甚至3.500真的重要吗?

真正重要的是从数据库中检索后它的显示方式。

或者我在这里遗漏了什么?

也不要使用浮点数,使用小数。 Float有各种各样的舍入问题,并不是很大。

答案 3 :(得分:17)

要存储值,您可以使用 DECIMAL(10,2)字段,然后可以使用FORMAT函数:

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

答案 4 :(得分:5)

为什么要将“3.50”存储到数据库中?就数据库而言,3.5 == 3.50 == 3.5000。

您的演示文稿和数据/日期/等格式应在应用程序中完成,而不是数据库。

答案 5 :(得分:5)

如果使用DECIMAL或NUMERIC类型,则可以将它们声明为例如DECIMAL(18,2),即使它们为0也会强制取2个小数。根据您期望的值大小,您可以更改第一个值参数。

答案 6 :(得分:0)

Binary不能精确地表示只有有限位数的浮点数。它不是那么多的数据丢失,但实际上是转换错误.. Here's the manual giving examples

您可以在浏览器中查看此操作,请参阅此代码段。



<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>
&#13;
&#13;
&#13;