2016-10-20 3 views
0

私はGolangを初めて使用しています。浮動小数点数を整数部分と小数部分に分けたかったのです。いくつかの研究の後、私はそれを実装しましたが、私のコードには問題があります。私は入力として5.8を使用していますが、結果は5と0.79999です。これは私に知らせてください行うには、他の方法がある場合はgolangを使用して全体と小数部を区切ります

0.7999999999999998 
5 

:私はこれを試してみました

package main 

import(
     "fmt" 
     "math" 
)  

func Round2(val float64) { 
     intpart, div := math.Modf(val) 
     fmt.Println(div) 

     fmt.Println(intpart) 

} 

func main() { 
     fmt.Println("Hello, playground") 
     Round2(5.8) 
} 

は、私がの出力を取得しています。 私は自分のコードでgo遊び場を挿入しました。

https://play.golang.org/p/O4n0k0XyMX

+0

精度エラーですが、出力のフォーマット方法によっても異なります。https://play.golang.org/p/eFmkI8x3tO – JimB

答えて

3

これは、浮動小数点演算のアーチファクトです。浮動小数点値は、使用しているプロセッサーによって使用される浮動小数点形式ですべての数値を正確に表現できるわけではないため、必ずしも期待する値とは限りません。明らかに、値は0.8に非常に近く、15の有効数字に等しい。これはGoに固有のものではないことに注意してください。代わりに

fmt.Println(div) 

は、それは、この記事のように見えます

fmt.Printf(".4f\n", div) // shows only 4 decimal places 

を試してみてくださいいくつかの良い情報を持っていますhttps://en.wikipedia.org/wiki/Floating_point#Accuracy_problems

0

あなたは、固定0.00で小数点以下のDecimal64p2タイプを使用することもできます精度 - https://github.com/strongo/decimal

正確な金額を保管するのに有効です。

関連する問題