Правила Йены: Как выполнить преобразование литерального типа значения из числа с плавающей точкой в ​​двойное (и наоборот)?

У меня есть следующее правило Йены для выполнения сложения:

@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, затем выполнить функцию sum с этими новыми значениями double, и, наконец, преобразовать выходные данные (? Somme) в значение с плавающей точкой?

Я думаю, что делая это, дополнительные десятичные разряды не могут быть добавлены к моему выводу.

1 ответ

Решение

Проблемы округления распространены при отображении чисел с плавающей запятой, поскольку большинство чисел с плавающей запятой не имеют точного представления в двоичном виде. Так что даже если вы должны были использовать floatс вместо doublesпроблема малых ошибок аппроксимации все равно возникнет.

У вас есть два варианта. Вы можете работать только с целыми числами, например, масштабируя (умножая) все свои числа на 100 или 1000, а затем не забывая уменьшать их, когда производите вывод для своих пользователей. Или вы можете рассматривать проблему с отображением как отдельную проблему, и, когда вы придете к отображению чисел в выходных данных, используйте библиотеку форматирования чисел, например, встроенную в Java, или другие предложения в Stackru. Лично я бы сделал второй выбор.

Другие вопросы по тегам