我想将 RatNum 表达式转换为点网小数。RatNum 有一个 ToDecimalString 方法,但没有一个 ToDecimal 方法。这有什么原因吗?除了 Decimal.Parse(ratnum.ToDecimalString(2)) 之外,还有其他方法可以将 RatNum 转换为小数吗?谢谢。
问问题
114 次
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 回答