0

我有以下耶拿规则来执行加法:

@prefix pm:     <http://example.org/ProductionMesure#>.
@prefix rdf:    <http://www.w3.org/1999/02/22-rdf-syntax-ns#>.
@prefix owl:    <http://www.w3.org/2002/07/owl#>.
@prefix pr:     <http://example.org/Production#>.

[r1:
(?mesCavTur rdf:type        pr:Mesure)
(?cavTur    owl:ensemble_de ?mesCavTur)
noValue(?cavTur owl:valeur ?x)
-> 
(?cavTur    owl:valeur      0.0)
]

[r2:
(?mesCavTur rdf:type        pr:Mesure)
(?mesCavTur owl:valeur      ?valeur)
noValue(?mesCavTur pm:flag pm:done)
(?cavTur    owl:ensemble_de ?mesCavTur)
(?cavTur    owl:valeur      ?oldValeur)
sum(?valeur, ?oldValeur, ?somme)
-> 
drop(4)
(?cavTur    owl:valeur      ?somme)
(?mesCavTur pm:flag pm:done)
hide(pm:flag)
]

该规则几乎可以正常工作以执行所需的加法结果。我遇到的问题是传递给 sum 函数的值都是浮点数,但返回的值 (?somme) 以双精度形式返回。

出乎意料的结果是它在结果中添加了一个小的十进制数(我认为这与类型转换有关)。

例如,如果我想求三个值 2.2、2.5 和 2.7 的总和;我得到的结果是 7.1000000953674316 (接近但不太正确)。

有没有办法使用这个 Jena 规则,我可以将我的浮点值 (?valeur & ?oldValeur) 转换为 double 类型,然后使用这些新的 double 值执行 sum 函数,然后最终转换输出 (?somme)变成浮点值?

我认为这样做可能不会将额外的小数位添加到我的输出中。

4

1 回答 1

0

显示浮点数时舍入问题很常见,因为大多数浮点数在 binary 中没有精确的表示。因此,即使您使用floats 代替doubles,仍然会出现小的近似误差问题。

你有两个选择。您只能使用整数,例如通过将所有数字缩放(乘以)100 或 1000,然后记住在为用户生成输出时将它们缩小。或者,您可以将显示问题视为一个单独的问题,当您在输出中呈现数字时,请使用数字格式库,例如Java 内置的库,或StackOverflow 上的其他建议。就个人而言,我会选择第二个。

于 2013-01-23T00:22:22.310 回答