Bei Verwendung von Golang zur Ausführung der vier Regeln der ETH ist eine Gleitkommaberechnung mit 18 Nachkommastellen erforderlich. Wenn Sie keinen Überlauf bemerken, treten Fehler bei der Berechnung auf. Verwenden Sie daher den Gleitkommatyp mit doppelter Genauigkeit für die korrekte Verwendung.
nur Golang
Die ETH wird vom Budget der 1000 ETH abgezogen und dann wieder hinzugefügt. Wenn es keine Fehler gibt, sollte es zu 1000 ETH zurückkehren.
error.go
package main
import (
"fmt"
"math/big"
"strings"
)
func main() {
budget, _ := new(big.Float).SetString("1000")
amount, _ := new(big.Float).SetString("0.123456789012345678")
balance := new(big.Float).Sub(budget, amount)
summary := new(big.Float).SetPrec(128).Add(balance, amount)
fmt.Printf("budget = %v\n", formatFloatPrice(budget, 18))
fmt.Printf("amount = %v\n\n", formatFloatPrice(amount, 18))
fmt.Printf("balance = budget - amount = %v\n", formatFloatPrice(balance, 18))
fmt.Printf("budget = balance + amount = %v\n", formatFloatPrice(summary, 18))
}
func formatFloatPrice(amount *big.Float, decimals int) string {
str := amount.Text('f', decimals)
if strings.Contains(str, ".") {
str = strings.TrimRight(str, "0")
if strings.HasSuffix(str, ".") {
str = str + "0"
}
}
return str
}
Wenn ich es starte, sollte es 1000 ETH sein, aber es funktioniert wegen des Fehlers nicht.
Ausführungsergebnis
budget = 1000.0
amount = 0.123456789012345678
balance = budget - amount = 999.876543210987654309
budget = balance + amount = 999.999999999999999987
Verwenden Sie die magische Methode SetPrec (), um die Genauigkeit von schwebenden Brüchen zu verbessern.
ok.go
package main
import (
"fmt"
"math/big"
"strings"
)
func main() {
budget, _ := new(big.Float).SetPrec(128).SetString("1000")
amount, _ := new(big.Float).SetPrec(128).SetString("0.123456789012345678")
balance := new(big.Float).SetPrec(128).Sub(budget, amount)
summary := new(big.Float).SetPrec(128).Add(balance, amount)
fmt.Printf("budget = %v\n", formatFloatPrice(budget, 18))
fmt.Printf("amount = %v\n\n", formatFloatPrice(amount, 18))
fmt.Printf("balance = budget - amount = %v\n", formatFloatPrice(balance, 18))
fmt.Printf("budget = balance + amount = %v\n", formatFloatPrice(summary, 18))
}
func formatFloatPrice(amount *big.Float, decimals int) string {
str := amount.Text('f', decimals)
if strings.Contains(str, ".") {
str = strings.TrimRight(str, "0")
if strings.HasSuffix(str, ".") {
str = str + "0"
}
}
return str
}
Ich bin sicher zur 1000 ETH zurückgekehrt!
Ausführungsergebnis
budget = 1000.0
amount = 0.123456789012345678
balance = budget - amount = 999.876543210987654322
budget = balance + amount = 1000.0
Recommended Posts