2012-04-08 4 views
2

Как я могу конвертировать 42.0 в 42.00 на Схеме?
Пример (на схеме):
Когда я делаю (/ 20.00 2), я получаю 10.0. Я хочу, чтобы 10.00 как результат выше, вместо 10.0Схема: точность десятичных чисел

+0

Я не получаю 10,0; Я получаю 1e1. Моя точка зрения заключается в том, что речь идет о внешнем представлении – GoZoner

ответ

5

Объекты, представленные 10.0 и 10.00 одинаковы. В схеме R5RS нет такой величины, как десятичное число с фиксированной точностью. Для чего нужна фиксированная точность? Если это актуально для вывода, вам нужно сделать отформатированную печать. Проверьте документацию по реализации схемы на функцию printf или format. Если, с другой стороны, вам действительно нужна десятичная арифметика, вам нужно либо использовать точные коэффициенты, либо округлять явно в соответствии с правилами, которые вы хотите использовать, или использовать целые числа и рассматривать их как единицы размера 1/100.

4

Номера 10.0 и 10.00 - это точно такие же. Может быть, вы хотите отформатировать свой вывод на строку с фиксированным числом десятичных знаков справа от точки? попробуйте это:

(define (right-pad number len) 
    (let* ((nstr (number->string number)) 
     (diff (- len (string-length nstr))) 
     (pads (if (> diff 0) (make-string diff #\0) ""))) 
    (string-append nstr pads))) 

Используйте это так:

(display (right-pad (/ 20.00 2) 5)) 
> 10.00 

Обратите внимание, что параметр len указывает общее количество символов искомых в результирующей строке, в том числе точки. Преимущество этого решения заключается в том, что он не зависит от внешних библиотек.

6

Решение Óscar хорошо работает, но еще более простым решением является использование SRFI-48, которое предоставляет дополнительные директивы формата.

(display (format "~0,2F" (/ 20.00 2)))

Смежные вопросы