Ответ 1
Номера с плавающей запятой печатаются по-разному, потому что печать выполняется для разных целей, поэтому сделаны различные варианты о том, как это сделать.
Печать числа с плавающей запятой - это операция преобразования: значение, закодированное во внутреннем формате, преобразуется в десятичную цифру. Тем не менее, есть варианты относительно деталей преобразования.
(A) Если вы делаете точную математику и хотите увидеть фактическое значение, представленное внутренним форматом, то преобразование должно быть точным: оно должно содержать десятичную цифру, которая имеет точно такую же значение как вход. (Каждое число с плавающей запятой представляет собой ровно одно число. Число с плавающей запятой, как определено в стандарте IEEE 754, не представляет интервала.) Иногда это может потребовать создания очень большого количества цифр.
(B) Если вам не нужно точное значение, но вам нужно конвертировать туда и обратно между внутренним форматом и десятичным, вам нужно точно преобразовать его в десятичную цифру (и точно ) достаточно, чтобы отличить его от любого другого результата. То есть вы должны создать достаточное количество цифр, чтобы результат отличался от того, что вы получили бы, преобразовывая числа, которые смежны во внутреннем формате. Это может потребовать создания большого количества цифр, но не так много, чтобы быть неуправляемым.
(C) Если вы хотите только дать читателю смысл номера и не нужно создавать точное значение, чтобы ваше приложение функционировало по желанию, тогда вам нужно только для создания как можно большего количества цифр для вашего конкретного приложения.
Какое из этих преобразований должно выполняться?
Различные языки имеют разные значения по умолчанию, потому что они были разработаны для разных целей или потому, что во время разработки нецелесообразно выполнять всю работу, необходимую для получения точных результатов, или по разным причинам.
(A) требует тщательного кода, а некоторые языки или их реализации не предоставляют или не гарантируют, чтобы это поведение выполнялось.
(B) требуется Java, я считаю. Однако, как мы видели в недавнем вопросе, это может привести к неожиданному поведению. (65.12
печатается как "65.12", потому что у последнего достаточно цифр, чтобы отличить его от близлежащих значений, но 65.12-2
печатается как "63.120000000000005", потому что между ним и 63.12 имеется другое значение с плавающей запятой, поэтому вам нужно дополнительные цифры, чтобы отличить их.)
(C) - это то, что некоторые языки используют по умолчанию. Это, по сути, неправильно, поскольку ни одно значение для того, сколько цифр для печати может быть подходящим для всех приложений. Действительно, мы видели на протяжении десятилетий, что это способствует продолжению неправильных представлений о плавающей точке, в основном, скрывая истинные ценности. Это, однако, легко реализовать и, следовательно, привлекательно для некоторых разработчиков. В идеале, язык должен по умолчанию печатать правильное значение числа с плавающей запятой. Если нужно отобразить меньшее количество цифр, количество цифр должно быть выбрано только разработчиком приложения, и мы надеемся, что в нем будет учтено соответствующее количество цифр для получения желаемых результатов.
Хуже того, некоторые языки в дополнение к тому, что они не отображают фактическое значение или достаточно цифр, чтобы отличить его, даже не гарантируют правильность приведенных цифр (например, значение, которое вы получите, округляя точное значение на количество отображаемых цифр). При программировании в реализации, которая не дает гарантии об этом поведении, вы не занимаетесь разработкой.