在PowerShell中添加大整数位数

在PowerShell中添加大整数位数,powershell,Powershell,在PowerShell中添加数字时,对于长度为-le29的整数,一切都很好 $largeInteger = 11111111111111111111111111111 #29 digits sums correctly $sumDigits = 0 $largeInteger while ($largeInteger -ne 0) { $sumDigits += $largeInteger % 10 $largeInteger = [MATH]::Floor($largeIn

在PowerShell中添加数字时,对于长度为-le29的整数,一切都很好

$largeInteger = 11111111111111111111111111111 #29 digits sums correctly $sumDigits = 0 $largeInteger while ($largeInteger -ne 0) { $sumDigits += $largeInteger % 10 $largeInteger = [MATH]::Floor($largeInteger /10) } $sumDigits $largeInteger=11111111111111#29位数字总和正确 $sumdights=0 $largeInteger 而($largeInteger-ne 0) { $sumDigits+=$largeInteger%10 $largeInteger=[数学]::地板($largeInteger/10) } $sumDigits 事情变得有趣时,长度的数字-燃气轮机29。在长度为30的情况下,总和=77


有什么想法吗?

大整数
从29 1更改为30 1将变量类型从十进制更改为双精度。 使用
$largeInteger.GetType()
可以查看这一点

算法中的数学在双打上不太好。在提示下重复运行循环中的2行,以查看每个步骤中的值

一旦
largeInteger
从十进制变为双精度,算法就不再精确。这就是为什么我建议在提示符上运行这两行

这是输出-

PS C:\> $largeInteger  % [double]10<br/>
8<br/>
PS C:\> $largeInteger  % [double]100<br/>
88<br/>
PS C:\> $largeInteger  % [double]1000000000000000000<br/>
1.11105501764518E+17<br/>
PS C:\> $largeInteger  % [double]1000000000000000000000<br/>
1.11111105501765E+20<br/>
PS C:\> $largeInteger  % [double]1000000000000000000000000000<br/>
1.11111111111104E+26<br/>
PS C:\> $largeInteger  % [double]100000000000000000000000000000<br/>
1.11111111111111E+28<br/>
PS C:\> $largeInteger  % [double]1000000000000000000000000000000<br/>
1.11111111111111E+29<br/>
PS C:\>$largeInteger%[double]10
8
私人秘书长:\>$largeInteger%[double]100
88
PS C:\>$largeInteger%[double]10000000000000000000000
1.11105501764518E+17
PS C:\>$largeInteger%[double]1000000000000000000
1.11111105501765E+20
PS C:\>$largeInteger%[double]10000000000000000000
1.11104E+26
PS C:\>$largeInteger%[double]1000000000000000000000
1.11111 E+28
PS C:\>$largeInteger%[double]10000000000000000000000
1.11111 E+29

您可以看到由于double的内部不精确表示而发生的失真,而double不能用二进制准确表示。随着除数的增加,递增余数的精度也会提高。

您有一个溢出的双精度,Powershell将其作为特例处理。您可以尝试
$largeInteger=[float]111111111111111
。使用浮点数仍然会丢失一些精度


有关详细信息,请参见

您必须安装bignum库。有。或者使用内置bignum的平台。

这应该有助于
($largeInteger-split''| measure-sum)。sum

是的-知道数据类型的变化,但这仍然不能解释行为。我已经扩展了答案,并在提示中添加了o/p以澄清。