为什么RatNum没有ToDecimal()方法?

时间:2013-05-22 15:33:16

标签: .net z3

我想将RatNum表达式转换为Dot Net小数。 RatNum有一个ToDecimalString方法,但不是ToDecimal方法。这有什么理由吗?除了Decimal.Parse(ratnum.ToDecimalString(2))之外还有其他方法可以将RatNum转换为小数吗?感谢。

1 个答案:

答案 0 :(得分:5)

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

我们可以使用ToStringDecimal,它采用精度p并产生一个最多为p位的有理数的十进制字符串表示。请注意,这可能是比Int64或单/双/十进制更适合的数字。

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

还有一些函数可以获得有理数的分子和分母,然后可以用它来产生其他格式的小数。

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

x.Numerator.Int / x.Denominator.Int

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