Для управления точностью арифметики с плавающей точкой необходимо использовать java.math. BigDecimal. Читайте потребность в BigDecimal John Zukowski для получения дополнительной информации.
, Учитывая Ваш пример, последняя строка как следовала бы за использованием BigDecimal.
import java.math.BigDecimal;
BigDecimal premium = BigDecimal.valueOf("1586.6");
BigDecimal netToCompany = BigDecimal.valueOf("708.75");
BigDecimal commission = premium.subtract(netToCompany);
System.out.println(commission + " = " + premium + " - " + netToCompany);
Это приводит к следующему выводу.
877.85 = 1586.6 - 708.75
Из Язык программирования Ruby :
Здесь Документы
Для длинных строковых литералов может не быть односимвольного разделителя, который можно было бы использовать, не беспокоясь о необходимости не забывать экранирующие символы внутри литерала. Решение этой проблемы в Ruby - позволить вам указать произвольную последовательность символов, которая будет служить разделителем для строки. Этот вид литерала заимствован из синтаксиса оболочки Unix и исторически известен как здесь документ . (Поскольку документ находится прямо здесь, в исходном коде, а не во внешнем файле.)
Здесь документы начинаются с
<<
или<< -
. За ними сразу же (пробелы не допускаются, чтобы избежать двусмысленности с оператором сдвига влево) иден- тификатором или строкой, определяющей конечный разделитель. Текст строкового литерала начинается со следующей строки и продолжается до тех пор, пока текст разделителя не появится в отдельной строке. Например:document = << HERE # Вот как мы начинаем здесь документ Это строковый литерал. Он состоит из двух строк и резко заканчивается ... ВОТ
Интерпретатор Ruby получает содержимое строкового литерала, считывая строку за раз со своего ввода. Однако это не означает, что
<<
должен быть последним в отдельной строке. Фактически, после прочтения содержимого документа здесь, интерпретатор Ruby возвращается к строке, в которой он находился, и продолжает ее анализ. Следующий код Ruby, например, создает строку, объединяя два документа здесь и обычную строку в одинарных кавычках:welcome = << HERE + << THERE + "World" Здравствуйте ВОТ Там ТАМ
<< ЗДЕСЬ
в строке 1 заставляет интерпретатор читать строки 2 и 3. А<< ТАМ
заставляет интерпретатор читать строки 4 и 5. После этих строк были прочитаны, три строковых литерала объединены в один.Конечный ограничитель здесь документа действительно должен появиться в отдельной строке: за разделителем не может следовать комментарий. Если здесь документ начинается с
<<
, то разделитель должен начинаться в начале строки. Если вместо этого литерал начинается с<< -
, то перед разделителем может быть пробел. Новая строка в начале здесь документа не является частью литерала, а новая строка в конце документа является. Следовательно, каждый документ здесь заканчивается символом конца строки, за исключением пустого документа здесь, КОНЕЦЕсли вы используете идентификатор без кавычек в качестве терминатора, как в предыдущих примерах, то здесь документ будет вести себя как строка в двойных кавычках для целей интерпретации экранирования обратной косой черты и символа
#
. Если вы хотите быть очень, очень буквальным и не допускать никаких escape-символов, поместите разделитель в одинарные кавычки. Это также позволяет вам использовать пробелы в вашем разделителе:document = << 'ЭТО КОНЕЦ, МОЙ ЕДИНСТВЕННЫЙ ДРУГ, КОНЕЦ' . . здесь много-много текста . без побега. . ЭТО КОНЕЦ, МОЙ ЕДИНСТВЕННЫЙ ДРУГ, КОНЕЦ
Одиночные кавычки вокруг разделителя намекают, что этот строковый литерал похож на строку в одинарных кавычках. На самом деле такой документ еще строже. Поскольку одинарная кавычка не является разделителем, нет необходимости экранировать одиночную кавычку обратной косой чертой. И поскольку обратная косая черта никогда не нужна как escape-символ, нет необходимости избегать самой обратной косой черты. Следовательно, в этом типе документа здесь обратная косая черта является просто частью строкового литерала.
Вы также можете использовать строковый литерал в двойных кавычках в качестве разделителя для документа здесь. Это то же самое, что и использование одного идентификатора, за исключением того, что в нем разрешены пробелы в разделителе:
document = << - "# # #" # Это единственное место, где мы можем разместить комментарий
#{title} # {title}
# {body} # # #Обратите внимание, что нет возможности включить комментарий в документ здесь, кроме как в первой строке после токена
<<
и перед началом литерала. Из всех символов#
в этом коде один вводит комментарий, три интерполирующих выражения в литерал, а остальные являются разделителем
Это Ruby " здесь документ " или синтаксис heredoc. Добавление знака - указывает на отступ.
Причина, по которой вы не можете найти документацию по оператору << -
, заключается в том, что это не оператор. Это буквальный синтаксис, например '
или "
.
В частности, это синтаксис здесь , который является одной из многих синтаксических форм строковых литералов в Ruby. . Здесь документы Ruby похожи на документы POSIX sh
, но обработка удаления пробелов отличается: в POSIX sh
здесь документы, разделенные << -
, только ведущие табуляции удаляются, но они удаляются из содержимого строки, тогда как в Ruby все пробелы удаляются, но только из разделитель .
Этот пост расскажет вам все, что вам нужно знать о синтаксисе строки "heredoc". Кроме того, вы можете просмотреть страницу rubydoc для синтаксиса строк.