Правила Йены: Как выполнить преобразование литерального типа значения из числа с плавающей точкой в двойное (и наоборот)?
У меня есть следующее правило Йены для выполнения сложения:
@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. Лично я бы сделал второй выбор.