66
package main

import (
    "fmt"
    "strconv"
    )

func main() {
    k := 10/3.0
    i := fmt.Sprintf("%.2f", k)
    f,_ := strconv.ParseFloat(i, 2)
    fmt.Println(f)
}

上記のプログラムを記述して、go float64 変数の精度を 2 に下げる必要がありました。この場合、strconv と fmt の両方を使用していました。それを行うことができる他の論理的な方法はありますか?

4

13 に答える 13

72

追加のコードは必要ありません...次のように簡単です

import (
    "fmt"
)

func main() {
    k := 10 / 3.0
    fmt.Printf("%.2f", k)
}

テストコード

于 2013-08-24T12:27:14.763 に答える
10

の使用について誰も言及していませんmath/big。元の質問に関連する結果は、受け入れられた回答と同じですが、ある程度の精度 ($money$) を必要とするフロートを使用している場合は、big.Float.

元の質問によると:

package main

import (
    "math/big"
    "fmt"
)

func main() {
    // original question
    k := 10 / 3.0
    fmt.Println(big.NewFloat(k).Text('f', 2))
}

残念ながら、定義された丸めモードを使用していないことがわかり.Textます (それ以外の場合は、この回答がより役立つ場合があります)。むしろ、常にゼロに向かって丸められているようです。

j := 0.045
fmt.Println(big.NewFloat(j).SetMode(big.AwayFromZero).Text('f', 2)

// out -> 0.04

それでも、float を として保存することには一定の利点がありますbig.Float

于 2016-06-07T03:28:43.293 に答える
5

大きな浮動小数点数をチェックしない関数

// Rounds like 12.3416 -> 12.35
func RoundUp(val float64, precision int) float64 {
    return math.Ceil(val*(math.Pow10(precision))) / math.Pow10(precision)
}

// Rounds like 12.3496 -> 12.34
func RoundDown(val float64, precision int) float64 {
    return math.Floor(val*(math.Pow10(precision))) / math.Pow10(precision)
}

// Rounds to nearest like 12.3456 -> 12.35
func Round(val float64, precision int) float64 {
    return math.Round(val*(math.Pow10(precision))) / math.Pow10(precision)
}
于 2020-11-02T13:19:31.690 に答える
0
func FloatPrecision(num float64, precision int) float64 {
    p := math.Pow10(precision)
    value := float64(int(num*p)) / p
    return value
}
于 2020-04-17T17:51:17.770 に答える