Frage

Wenn Sie die Ziffern einer Zahl in Powershell hinzufügen, alles ist gut mit ganzen Zahlen, die eine Länge haben -le 29.

$largeInteger = 11111111111111111111111111111 #29 digits sums correctly
$sumDigits = 0
$largeInteger
while ($largeInteger -ne 0)
{
    $sumDigits += $largeInteger  % 10
    $largeInteger  = [MATH]::Floor($largeInteger /10)   
}

$sumDigits

es interessant, wenn die Länge der Nummer 29. Im Fall -gt wo die Länge 30 ist, wobei die Summe = 77.

Irgendwelche Ideen?

War es hilfreich?

Lösung

Sie müssen eine bignum Bibliothek installieren. Es gibt einige Hinweise hier . Entweder das, oder eine Plattform verwenden, die bignums eingebaut.

hat

Andere Tipps

Sie haben eine überflogenen doppelt so hoch als Spezialfall von Powershell behandelt wird. Sie könnten versuchen, $largeInteger = [float]111111111111111111111111111111. Sie werden noch einige Präzision mit einem Schwimmer verlieren.

Weitere Informationen finden Sie unter Schwimmer (C # -Referenz)

Ändern largeInteger von 29 1en bis 30 1 die Änderungen der Typ der Variablen von Dezimal zu verdoppeln. Verwenden $ largeInteger.GetType (), um zu sehen, dass.

Die Mathematik im Algorithmus funktioniert nicht so fein auf Doppelzimmer. Führen Sie die 2 Zeilen in der Schleife wiederholt auf der Eingabeaufforderung, die Werte in jedem Schritt zu erhalten.

Sobald largeInteger aus Dezimalzahl geht zu verdoppeln, ist das arithmetische präzise nicht mehr. Deshalb habe ich vorgeschlagen, die zwei Linien auf der Eingabeaufforderung runnning.

Hier ist die Ausgabe -
PS C:> $ largeInteger% [double] 10
8
PS C:> $ largeInteger% [double] 100
88
PS C:> $ largeInteger% [double] 1000000000000000000
1.11105501764518E + 17
PS C:> $ largeInteger% [double] 1000000000000000000000
1.11111105501765E + 20
PS C:> $ largeInteger% [double] 1000000000000000000000000000
1.11111111111104E + 26
PS C:> $ largeInteger% [double] 100000000000000000000000000000
1.11111111111111E + 28
PS C:> $ largeInteger% [double] 1000000000000000000000000000000
1.11111111111111E + 29

Sie können die Verzerrung sehen, die aufgrund der internen ungenauen Darstellung des Doppels auftritt, die nicht genau binär dargestellt werden kann. Da der Divisor die Genauigkeit des zunehmenden Restes erhöht verbessert auch.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top