【问题标题】:Jena Rules: How to perform literal value type conversion from float to double (and vice versa)?Jena 规则:如何执行从 float 到 double 的文字值类型转换(反之亦然)?
【发布时间】:2013-01-06 02:36:19
【问题描述】:

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

@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) 转换为浮点值?

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

【问题讨论】:

    标签: rdf jena owl semantics jena-rules


    【解决方案1】:

    显示浮点数时,舍入问题很常见,因为大多数浮点数do not have a precise representation in binary。所以即使你用floats代替doubles,还是会出现近似误差小的问题。

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

    【讨论】:

    • 感谢您的回复。知道如何转换数据类型仍然很好,但事实证明这非常有用。
    猜你喜欢
    • 1970-01-01
    • 2014-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 2015-11-16
    相关资源
    最近更新 更多