Domanda

Quando si aggiungono le cifre di un numero in PowerShell, tutto va bene con numeri interi che hanno una lunghezza -le 29.

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

$sumDigits

Le cose diventano interessanti quando la lunghezza del numero -gt 29. Nel caso in cui la lunghezza sia 30, la somma = 77.

Qualche idea?

È stato utile?

Soluzione

Dovrai installare una libreria bignum. Ci sono alcuni suggerimenti qui . O quello o usa una piattaforma che ha i bignum integrati.

Altri suggerimenti

Hai un doppio sorvolato che viene gestito come caso speciale da Powershell. Potresti provare $ largeInteger = [float] 111111111111111111111111111111 . Perderai comunque un po 'di precisione usando un galleggiante.

Per ulteriori informazioni, vedere float (Riferimenti per C #)

La modifica di largeInteger da 29 1 a 30 1 modifica il tipo di variabile da Decimale a Doppio. Usa $ largeInteger.GetType () per vederlo.

La matematica dell'algoritmo non funziona così bene sui doppi. Esegui ripetutamente le 2 linee nel ciclo sul prompt per visualizzare i valori in ogni passaggio.

Quando largeInteger passa dal decimale al doppio, l'aritmetica non è più precisa. Questo è il motivo per cui ho suggerito di eseguire le 2 righe sul prompt.

Ecco l'output -
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

È possibile vedere la distorsione che si verifica a causa della rappresentazione imprecisa interna del doppio che non può essere rappresentata con precisione in binario. Man mano che il divisore aumenta, migliora anche l'accuratezza del resto crescente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top