Lorsque vous utilisez golang pour exécuter les quatre règles de l'ETH, un calcul en virgule flottante avec 18 chiffres après la virgule décimale est requis. Si vous n'êtes pas conscient du dépassement, il y aura des erreurs dans le calcul, utilisez donc le type virgule flottante double précision dans l'utilisation correcte.
seulement golang
L'ETH est soustrait du budget de 1000 ETH, puis rajouté. S'il n'y a pas d'erreur, il devrait revenir à 1000 ETH.
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
}
Quand je l'exécute, cela devrait être 1000 ETH, mais cela ne fonctionne pas à cause de l'erreur.
Résultat d'exécution
budget = 1000.0
amount = 0.123456789012345678
balance = budget - amount = 999.876543210987654309
budget = balance + amount = 999.999999999999999987
Utilisez la méthode magique SetPrec () pour améliorer la précision des fractions flottantes.
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
}
Je suis revenu à 1000 ETH en toute sécurité!
Résultat d'exécution
budget = 1000.0
amount = 0.123456789012345678
balance = budget - amount = 999.876543210987654322
budget = balance + amount = 1000.0
Recommended Posts