2016-05-08 1 views
2

Я хотел бы быть в состоянии преобразовать большой Double к Integer, но мне кажется, что реализация Фреге Haskell из floor не уступает в Integral типа. Вместо этого, похоже, он реализован для взаимодействия с тем, как это делает Java, и принимает тип Floating в Double, Floating r => r -> Double. Я мог бы использовать round, но это раунды, а не усечение (хотя я мог бы вычесть 0.5 и , затем раунд). Я предпочел бы работать, не прибегая к использованию Int или Long, который, как и последний, по-прежнему ограничен точностью.Фрег Дважды в целое

Любые способы использования напольного покрытия типа с плавающей точкой для произвольного типа целых чисел точности?

+1

Вашего вычитание подход кажется разумным с учетом ограничений, но я никогда не использовал Фрег. – dfeuer

+0

Судя по http://stackoverflow.com/questions/17960186/is-there-anyway-to-convert-from-double-to-biginteger, для этого требуется некоторое представление об этом. – Ingo

ответ

3

Эта функциональность действительно недоступна. Причина в том, что Java, по-видимому, не предлагает методы, которые его поддерживают.

Что вы можете сделать, так это преобразовать (напольное) двойное в String и преобразовать его в Integer.

Вот пример:

frege> import Prelude.Math(floor) 
frege> integerFromDouble d = String.aton ("%.0f".format (floor d)) 
function integerFromDouble :: Math.Floating a => a -> Integer 
frege> integerFromDouble 987654321e20 
0000000000000000000 

Интересно, если есть более эффективный метод, который каким-то образом извлекает мантиссу и экспоненту от Double и вычисляет целое число.

Обратите внимание, что выше функции является небезопасным, поскольку NaN, + Infinity и -Infinity существуют:

frege> integerFromDouble (5/0) 
java.lang.NumberFormatException: For input string: "Infinity" 

Вы можете либо проверить, что отдельно или заменить String.aton с String.integer, который возвращает

Either NumberFormatException Integer 

Если вы можете убедиться, что ваши расчеты не превышают мощность Long, что вы хотите сделать:

round . floor 
Смежные вопросы