Fehlerfreie Berechnung mit Golangs big.Float

Einführung

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.

Lass es uns versuchen

Dinge notwendig

nur Golang

Welche Art von Fehler wird auftreten?

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

Wie kann der Fehler behoben werden?

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

Fehlerfreie Berechnung mit Golangs big.Float
Die Geschichte der numerischen Berechnung von Differentialgleichungen mit TensorFlow 2.0
1. Mit Python 1-3 gelernte Statistiken. Berechnung verschiedener Statistiken (Statistiken)
Echtzeitberechnung des Durchschnittswertes mit Corroutine
1. Mit Python 1-2 gelernte Statistiken. Berechnung verschiedener Statistiken (Numpy)
Sequentielle Berechnung des Durchschnittswertes mit Online-Algorithmus
Berechnung der gegenseitigen Informationsmenge (kontinuierlicher Wert) mit numpy
Führt eine Hochgeschwindigkeitsberechnung nur für bestimmte Deskriptoren mit mordred durch
Versuchen Sie, den Inhalt von Word mit Golang zu erhalten
Bash mit Golang anrufen
Numerische Berechnung mit Python
So aktivieren Sie das Lesen / Schreiben von net.Conn mit golang, um mit dem Kontext abzubrechen
Erste Schritte mit PKI mit Golang ―― 4
[Python] Berechnungsmethode mit numpy
Bewegungsgleichung mit Sympy
Parallele Verarbeitung mit Parallel von Scikit-Learn
Berechnung der Ähnlichkeit durch MinHash
Vorhersage des Nikkei-Durchschnitts mit Pytorch 2
Erinnerungen an den Kampf mit Selen
Über die Kostenberechnung von MeCab
Vorhersage des Nikkei-Durchschnitts mit Pytorch