JavaRush /Java блог /Архив info.javarush /Немного вглубь о числах BigDecimal
grishin
27 уровень
Харьков

Немного вглубь о числах BigDecimal

Статья из группы Архив info.javarush
Наконец, после 3-х месяцев перерыва, возвращаюсь к прохождению курса. На перерыв ушел в начале января. Решил тогда переключиться на изучение других дисциплин, как то HTML/CSS/Javascript. Попутно и технологии начал учить (сервлеты и JSP). На тот момент прошел 24 уровня и немного завяз на внутренних классах — не то, чтобы что-либо было не понятно, просто требовалась систематизация полученных знаний, т. к. слишком их много было получено за короткий период в режиме "галопом по Европам". Так вот, сейчас я решил тщательно пройтись по первому тому Хорстмана для закрепления знаний Java Core и одновременно дорешать оставшиеся задачи с предыдущих уровней, после чего пойти дальше по уровням. Начал с бонусной задачи с 15-го уровня про факториал. Разделавшись с ней, решил глубже разобраться с классом BigDecimal. Популярных статей в инете особо не нашел, тогда залез в документацию и первый абзац в ней сразу же заставил пошевелить мозгами, как-то не все в нем было ясно. Решил докопаться до истины, а чтобы труды не пропали даром, оформил все в виде статьи и вот выкладываю на суд сообщества для обмена мнениями, да и может кому-то будет подспорьем. Итак, я взял первый абзац и разбил его на предложения. В нем всего 5 предложений. Предложения номер 3 и 4 подчеркнул и переместил в конец абзаца (зачем так сделал — читайте дальше). И перевод соответственно сделал в таком измененном порядке. Оригинал первого абзаца
  1. Immutable, arbitrary-precision signed decimal numbers.
  2. A BigDecimal consists of an arbitrary precision integer unscaled value and a 32-bit integer scale.
  3. If zero or positive, the scale is the number of digits to the right of the decimal point.
  4. If negative, the unscaled value of the number is multiplied by ten to the power of the negation of the scale.
  5. The value of the number represented by the BigDecimal is therefore (unscaledValue × 10-scale).
Оригинал с измененным порядком предложений
  1. Immutable, arbitrary-precision signed decimal numbers.
  2. A BigDecimal consists of an arbitrary precision integer unscaled value and a 32-bit integer scale.
  3. The value of the number represented by the BigDecimal is therefore (unscaledValue × 10-scale).
  4. If zero or positive, the scale is the number of digits to the right of the decimal point.
  5. If negative, the unscaled value of the number is multiplied by ten to the power of the negation of the scale.
Развернутый перевод (каждый пункт в переводе соответствует пункту в оригинале)
  1. Это неизменяемые дробные1 десятичные числа со знаком2, произвольной длины34.
  2. Число BigDecimal задается двумя параметрами. Первый из них, т.н. unscaled value, является целым числом неограниченной длины. Зная только этот параметр, нельзя ничего сказать о фактической величине числа BigDecimal. Для этого нужно обязательно знать второй параметр — 32-битное целое число, которое называется масштабом (scale).
  3. Тогда величину числа BigDecimal можно вычислить по следующей формуле: unscaledValue × 10-scale
  4. Если число BigDecimal равно нулю или положительное, масштаб — это количество цифр после десятичной точки.
  5. Если число BigDecimal отрицательное, его unscaled value умножается на 10, возведенное в степень, равную scale со знаком минус.
Примечания к переводу
1. Дробные, потому что в "arbitrary-precision" заложено помимо прочего,
   что это числа точные, а точные числа должны быть с десятичной запятой,
   другими словами — дробными.
2. Т.е. могут быть как положительными, так и отрицательными.
3. Произвольной длины, потому что "arbitrary-precision" означает также
   "произвольное количество цифр".
4. Фактически, числа BigDecimal — это вещественные числа. Но устанавливая
   разные настройки, можно использовать их не только в научных расчетах,
   а и в финансовых.
Так вот, подчеркнутые предложения были основным запутывающим для меня фактором — я бы их на самом деле просто убрал из текста, т. к. фактически они об одном и том же, а кроме того о том же, что говорится и в предложении номер 5. Т.е. в трех предложениях подряд говорится только о том, что unscaled value умножается на 10, возведенное в степень, равную scale со знаком минус. Это сбивает с толку при первом прочтении, т. к. читая предложение номер 3, понимаешь, что раз стоит if, значит тут будет что-то одно, а в следующем предложении — что-то другое. Ан нет — в обоих предложениях то же самое, только другими словами. Ну а третье (последнее в абзаце) предложение подряд о том же самом, наверное, как контрольный выстрел. Неясно, зачем текст составили таким запутанным образом, ведь формула unscaledValue × 10-scale из последнего предложения максимально ясно, однозначно и исчерпывающе дает определение большому числу.
Комментарии (3)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Sygurny Уровень 26
11 апреля 2015
Блин, если так курить все мануалы это сколько времени то уйдёт… Эх, где мои 15 лет…