Jena Rules:如何执行从float到double的字面值类型转换(反之亦然)?

时间:2013-01-22 18:44:47

标签: rdf jena owl semantics jena-rules

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

@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)返回为double。

由此产生的意外结果是它在结果中添加了一个小的十进制数(我假设它与类型转换有关)。

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

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

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

1 个答案:

答案 0 :(得分:0)

当显示浮点数时,舍入问题很常见,因为大多数浮点数do not have a precise representation in binary。因此,即使您使用float而不是doubles,仍会出现小近似误差的问题。

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

相关问题