65

3.50 を mysql テーブルに格納したいと考えています。格納する float がありますが、3.50 ではなく 3.5 として格納されます。末尾のゼロを取得するにはどうすればよいですか?

4

7 に答える 7

101

通貨の値を float として格納しないでください。DECIMAL または NUMERIC 型を使用してください。

MySQL 数値型のドキュメント

編集と説明:

浮動小数点値は精度が限られているため、丸め誤差の影響を受けやすいため、10.00 ではなく 9.99 しか得られないことを気にしない限り、これらは固定小数点数であり、そのような問題がないため、DECIMAL/NUMERIC を使用する必要があります。

于 2010-02-12T11:07:52.897 に答える
38

計算で丸め誤差が発生する可能性があるため、お金を float として格納することは一般的には良い考えではありません。

代わりに DECIMAL(10,2) の使用を検討してください。

于 2010-02-12T12:35:12.820 に答える
20

それが 3.5、3.50、または 3.500 として格納されているかどうかは本当に重要ですか?

本当に重要なのは、データベースから取得した後にどのように表示されるかです。

それとも、ここで何か不足していますか?

また、浮動小数点を使用せず、小数を使用してください。Float にはあらゆる種類の丸めの問題があり、それほど大きくはありません。

于 2010-02-12T11:06:33.010 に答える
18

値を格納するには、DECIMAL(10,2)フィールドを使用してから、FORMAT関数を使用できます。

SELECT FORMAT(`price`, 2) FROM `table` WHERE 1 = 1
于 2010-02-12T11:09:56.403 に答える
5

なぜ「3.50」をデータベースに保存したいのですか? データベースに関する限り、3.5 == 3.50 == 3.5000。

数字/日付/その他のプレゼンテーションと書式設定は、データベースではなく、アプリケーションで行う必要があります。

于 2010-02-12T11:08:29.943 に答える
5

DECIMAL または NUMERIC 型を使用する場合は、たとえば DECIMAL(18, 2) のように宣言できます。これにより、たとえ 0 であっても 2 つの小数が強制されます。期待する値の大きさに応じて、最初のパラメーターの値を変更できます。

于 2010-02-12T11:09:39.770 に答える
1

バイナリは、ビット数が限られているため、浮動小数点を正確に表現できません。データの損失はそれほど多くありませんが、実際には変換エラーです。 例を示したマニュアルを次に示します

ブラウザでこの動作を確認できます。このコード スニペットで自分の目で確かめてください。

<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>

于 2017-06-25T03:02:59.883 に答える