【问题标题】:Powershell bigint output differ from declared valuePowershell bigint 输出与声明值不同
【发布时间】:2019-08-17 09:07:34
【问题描述】:
我正在将 lesspass 密码管理器移植到 powershell,但在实现 _consume_entropy() method 时遇到了问题,尤其是 Python divmod。
再现
PS> [bigint]$EntropyAsInt = 99600400399777174105034830393873797761817714609490038944205586760025858632478
PS> Write-Host $EntropyAsInt
99600400399777173995117538344184441997741701018199539534149245151907290284032
区别
99600400399777174105034830393873797761817714609490038944205586760025858632478
99600400399777173995117538344184441997741701018199539534149245151907290284032
^ start diverging he
问题
这是怎么回事?我是不是用错了类型?
【问题讨论】:
标签:
powershell
.net-core
biginteger
powershell-v6.0
【解决方案1】:
我可以复制这种行为,但无法解释它。我可以做的是为您提供解决方法。将变量定义为[bigint],然后将您的数字解析为引用先前创建的变量的字符串。
[bigint]$EntropyAsInt=0
[bigint]::TryParse('99600400399777174105034830393873797761817714609490038944205586760025858632478',[ref]$EntropyAsInt)
然后您可以验证$EntropyAsInt 是否包含您之前指定的号码。
【解决方案2】:
感谢 Powershell slack 上的 ?Joel?:
问题是 bigint 转换在解析值之后才会生效。它将首先被解析为双精度,其中出现不精确的地方
如果您希望它保留确切的数字,则需要将文字放在引号中以使其成为字符串并让强制转换本身进行解析
[bigint]$var = "12345342827266162738883736363"
好好工作
[bigint]$EntropyAsInt = "99600400399777174105034830393873797761817714609490038944205586760025858632478"
【解决方案3】:
99600400399777174105034830393873797761817714609490038944205586760025858632478 是 [Double]...
PS> 99600400399777174105034830393873797761817714609490038944205586760025858632478
9.96004003997772E+76
PS> (99600400399777174105034830393873797761817714609490038944205586760025858632478).ToString("F0")
99600400399777200000000000000000000000000000000000000000000000000000000000000
PS> (99600400399777174105034830393873797761817714609490038944205586760025858632478).GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Double System.ValueType
当它被转换为[BigInt] 时,原始值已经丢失。以[String] 开头会保留它,但...
PS> [bigint]$EntropyAsInt = '99600400399777174105034830393873797761817714609490038944205586760025858632478'
PS> $EntropyAsInt
99600400399777174105034830393873797761817714609490038944205586760025858632478
更多信息请参见Instantiating a BigInteger Object。