PROLOG - 如何舍入浮点数的小数?

PROLOG - How to round decimals of floating point numbers?

我在知识库中有这一行:

height(Hipot,Y) :- Y is sin(pi/6)*Hipot.

计算直角三角形的直角之一。

当向 Prolog 询问 Y 的值时,即 cathetus,我得到一个不准确的数字:

?- height(1,Y).
Y = 0.49999999999999994.

但实际值为1/2,所以应该输出0.5。我猜不准确是因为使用了 pi,但我想继续使用它,所以如何将 Y 舍入到 0.5?

我也在努力学习序言。内置的舍入函数只求最接近的整数,所以我定义了一个规则,将其扩展为舍入到一定位数:

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.

一个直接的解决方案是使用format/2输出具有给定"precision"的数字.例如:

?- height(1,Y), format("~2f", [Y]).
0.50
Y = 0.49999999999999994.

请注意,浮点数总是会导致此类问题,因此我建议尽可能使用 有理数

通过使用format/3你可以输出到一个参数:

format(atom(A), '~2f', [Y]), writeln(A).