Пусть кто-то измеряет спесь с линейкой и определяет, что/с диаметром 3/8" дюйма. Другой человек измеряет отверстие с суппортами и обнаруживает, что это 9.5267mm. Будет ли колышек поместиться в отверстие?
Если кто-то преобразует грубое измерение в форму с более высокой точностью, обнаруживается, что отверстие кажется 0.0017 мм (т. Е. Около 1/15000 ") больше, чем привязка. Если один из них преобразует их в форму с низкой точностью, то обнаружится, что значения неотличимы.
Если привязка, которая была измерена как 3/8 ", на самом деле точно равна 9,525 мм [точный метрический эквивалент], такое измерение может быть преобразовано в форму с более высоким разрешением без потерь преобразования. Если, однако, это просто означает «что-то, что ближе к знаку 3/8», чем к значению 23/64 или 25/64 », такое преобразование приведет к тому, что, как правило, ожидается, что приближение будет интерпретироваться как более точное, чем оно действительно .
Некоторые люди считают, что привязка и отверстие считаются разными по размеру, как хорошее. Лично я считаю, что было бы лучше рассматривать их как неотличимые. С измерениями, как описано, есть нет никаких оснований полагать с уверенностью, что привязка больше, чем дыра; это, вероятно, не совсем одинаково, но называть их неразличимыми точнее, чем говорить, что привязка больше.
Лично я ненавижу языковые правила, которые требуют, чтобы значения были записаны или отлиты для float [single-precision] только для того, чтобы заткнуть компилятор. Если один хочет установить float
равным значению ближайшего к 4.7, один должен быть в состоянии просто сказать:
float f=4.7;
и добиться этого эффекта. Человек, который видит:
static final float coef = 4.7f;
... some time later
float f = coef;
double d = coef;
не будет иметь никакого способа узнать, была ли цель установить d
к значению double
равного значению ближайшего float
до 4,7, или была ли цель установить d
к значению double
ближайший к 4.7.К сожалению, Java не предоставляет никаких средств, с помощью которых можно объявить константу, которую можно без помех присвоить float
без явного приведения в действие, но при назначении double
будет использовать точность, доступную в этом типе.
Кстати, если моя цель состояла в том, чтобы установить некоторые double
переменной v
равным значению из float
ближе к указанному числовому значению coef
, а не значению double
ближе всего к этому числовому значению, я бы, вероятно, его код очень явно:
v = (double)(float)coef;
Это сделало бы ясным и недвусмысленным тот факт, что программист ожидавшую и намеревающиеся что double
будет присвоено значение, которое было ранее округляется до float
точности. Если нет (double)
typecast, нужно было бы рассмотреть возможности, которые программист мог ожидать v
как float
(например, поскольку, когда код был написан, это был float
, но с тех пор он был изменен на double
). Если нетtypecast, нужно было бы рассмотреть возможность того, что программист ожидал, что coef
будет double
(например, потому что это было, но кто-то изменил его на float, чтобы он мог быть присвоен переменным типа float
без компилятора кудахтанье).
Проблема в том, что ни один из номеров, которые вы используете, фактически * 6.2 или 7.6 ... –
Но некоторые из них более отличаются от 6.2 и 7.6, чем другие. –