Agregar dígitos de enteros grandes en PowerShell
-
03-07-2019 - |
Pregunta
Al agregar los dígitos de un número en PowerShell, todo está bien con enteros que tienen una longitud -le 29.
$largeInteger = 11111111111111111111111111111 #29 digits sums correctly $sumDigits = 0 $largeInteger while ($largeInteger -ne 0) { $sumDigits += $largeInteger % 10 $largeInteger = [MATH]::Floor($largeInteger /10) } $sumDigits
Las cosas se ponen interesantes cuando la longitud del número -gt 29. En el caso donde la longitud es 30, la suma = 77.
¿Alguna idea?
Solución
Tendrá que instalar una biblioteca bignum. Hay algunos consejos aquí . O eso, o use una plataforma que tenga bignums incorporados.
Otros consejos
Tiene un doble sobrevolado que Powershell está manejando como un caso especial. Puede probar $ largeInteger = [float] 111111111111111111111111111111
. Aún perderá algo de precisión usando un flotador.
Para obtener más información, consulte float (Referencia de C #)
Cambiar largeInteger de 29 1's a 30 1's cambia el tipo de la variable de Decimal a Double. Use $ largeInteger.GetType () para ver eso.
Las matemáticas en el algoritmo no funcionan tan bien en dobles. Ejecute las 2 líneas en el bucle repetidamente en el indicador para ver los valores en cada paso.
Una vez que largeInteger pasa de decimal a doble, la aritmética ya no es precisa. Es por eso que sugerí ejecutar las 2 líneas en el indicador.
Aquí está la salida -
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% [doble] 1000000000000000000000000000
1.11111111111104E + 26
PS C: > $ largeInteger% [doble] 100000000000000000000000000000
1.11111111111111E + 28
PS C: > $ largeInteger% [doble] 1000000000000000000000000000000
1.11111111111111E + 29
Puede ver la distorsión que se produce debido a la representación interna imprecisa del doble que no se puede representar con precisión en binario. A medida que el divisor aumenta, la precisión del resto creciente también mejora.