1

我想将 RatNum 表达式转换为点网小数。RatNum 有一个 ToDecimalString 方法,但没有一个 ToDecimal 方法。这有什么原因吗?除了 Decimal.Parse(ratnum.ToDecimalString(2)) 之外,还有其他方法可以将 RatNum 转换为小数吗?谢谢。

4

1 回答 1

5

这个问题的简短回答是 System.Decimal 类型是(非 IEEE 754)浮点格式,而 Z3 的 RatNum 是有理数的无限精度格式。这是必需的,因为有理数的十进制扩展不一定是有限的(例如,对于 1/3)。

我们可以使用 ToStringDecimal ,它采用精度 p 并生成有理数的十进制字符串表示形式,最多有 p 位数字。请注意,这可能比 Int64 或 Single/Double/Decimal 的位数更多。

或者,我们可以使用生成精确表示的 ToString,例如“1/3”。

还有一些函数可以获取有理数的分子和分母,然后可以使用这些函数生成其他格式的小数。

所以,长答案是:Z3 是无限精确的,如果需要近似解,这必须在 Z3 之外完成,或者通过建议的字符串转换方法,或者通过其他转换,例如

x.Numerator.Int / x.Denominator.Int

如果已知这些整数不会超过 int 类型的最大值,并且应用程序不会受到结果的浮点近似的影响。

于 2013-05-24T21:29:46.487 回答