2016-06-20 8 views
0

golang float64の値に整数を掛け合わせると、浮動小数点数の格納方法による結果の精度が高くなります。ここ は、私は結果が`golang` float64の倍精度浮動小数点エラーを正しく処理する方法

Hello, playground 1.2000000000000002 

ここで同じ playground

用プレイリンクは/最高の標準がありますされている

package main 

import (
"fmt" 
) 

func main() { 
     var l float64 = 0.2 
    fmt.Println("Hello, playground",l*6) 
} 

を参照しています問題を示したコードスニペットですエラーのラウンドを練習する?

+0

[エラーをintに変換するのfloat64をGolang]の可能性/関連複製(http://stackoverflow.com/questions/36052922/golang-converting-float64-to-int-error)私は、その場合には通貨を取り扱っております – icza

答えて

1

これは、ユースケースの種類と表示する桁数によって異なります。あなたはすることができます:

func main() { 
    var l float64 = 0.2 
    fmt.Printf("Hello, playground %.8f",l*6) 
} 

と小数点以下8単位を示しています。しかし、通貨を扱っている場合は、たとえば、浮動小数点をまったく使用しない方が良いでしょう。すべてをセント(米国)または数(通貨の最小金額)として保存します。

+0

あなたのポイントは意味が分かります私は最低の分母に対処する必要がありますが、私は場合も内部では、浮動小数点値としても最小分母を格納する必要があります すなわち、1つの料金プランは、 2番目と私は7秒の使用量を3.5セントとして保存することができます。顧客に請求すると、これらすべてが追加され、最小の分母に丸められます。 golangの数学パッケージでラウンド関数を見たことがないので、一般的なケースで使用されているベストプラクティスがあるかどうかを知りたいだけでした。 –

+1

通貨私は浮動小数点を完全に避けています。これは、レートを 'uint64 hundredthsOfACent'として保存してから、' uint64 cents'として支払った価格を保存する必要があることを意味します。お金があれば、丸め誤差を完全に避ける方が良いでしょう。 – dave

+0

通貨計算では、https://github.com/EricLagergren/decimal – ABri

関連する問題