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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top