我在知识库中有这一行:
height(Hipot,Y) :- Y is sin(pi/6)*Hipot.
计算直角三角形的其中一根导管。
向Prolog询问Y
(即导管)的值时,我得到了一个不正确的数字:
?- height(1,Y).
Y = 0.49999999999999994.
但实际值为1/2,因此应输出0.5。我猜这是由于使用了pi
而引起的,但是我想继续使用它,那么如何将Y
舍入到0.5?
答案 0 :(得分:4)
一种简单的解决方案是使用 format/2
来以给定的“精度” 输出数字。例如:
?- height(1,Y), format("~2f", [Y]). 0.50 Y = 0.49999999999999994.
请注意,浮点数将始终导致此类问题,我建议尽可能使用例如有理数。
答案 1 :(得分:3)
我也在尝试学习序言。内置的舍入函数仅舍入到最接近的整数,因此我定义了一条规则,将其扩展为舍入到一定位数:
round(X,Y,D) :- Z is X * 10^D, round(Z, ZA), Y is ZA / 10^D
我不确定它是否是惯用的,但它似乎可行:
?- round(5.5555, Y, 2).
Y = 5.56.
答案 2 :(得分:0)
通过使用format / 3,您可以输出到参数:
format(atom(A), '~2f', [Y]), writeln(A).