У меня есть целое число, представляющее десятые доли.Вместо деления на 10, что приводит к ошибкам округления (и потере времени), существует ли быстрый способ добавления десятичной точки перед последней цифрой?
Некоторая магия, такая как
snprintf(dest,len,"%d4.-1", 123) resulting in 12.3
причина состоит в том, чтобы избежать ошибок округления, например, в деньгах, когда сумма рассчитывается внутренне как целые центы, а не дроби в £, € или $.
Если я правильно помню свой COBOL, здесь можно указатьтакой формат, как 9 990,00, в котором 1234 печатается как 12,34, а 1 - как 0,01.
void setup() {
Serial.begin(115200);
delay(1000);
uint16_t i16 = 0;
float f = 998;
for (i16 = 998; i16 < 1011; i16++) {
Serial.print(i16 / 1000);
Serial.print(" ");
Serial.print(f / 1000);
Serial.printf(" %0.3f %0.3f %0.7f\n",i16/1000,f/1000,f/1000);
f = f + 1;
}
}
int / 10 по-прежнему int, поэтому 123/10 = 12.
Странно fprint("%0.2f",123/10)
печатает 0.00
0 1.00 0.000 0.998 0.9980000
0 1.00 0.000 0.999 0.9990000
1 1.00 0.000 1.000 1.0000000
1 1.00 0.000 1.001 1.0010000
1 1.00 0.000 1.002 1.0020000
1 1.00 0.000 1.003 1.0030000
1 1.00 0.000 1.004 1.0039999 <--- Rounding error
1 1.00 0.000 1.005 1.0050000
1 1.01 0.000 1.006 1.0060000
1 1.01 0.000 1.007 1.0070000
1 1.01 0.000 1.008 1.0080000
1 1.01 0.000 1.009 1.0089999 <--- Rounding error
1 1.01 0.000 1.010 1.0100000
% 0,6f не дает ошибок округления, но% 0,7f делает.
Так что для дробных целых чисел это будетбыло бы неплохо иметь целочисленный формат со смещенной десятичной точкой.
Использование поплавков иногда может дать некоторые забавные результаты, только вчера я видел «Ожидается, что вода поднимется между 10,000000002 и 12 футами».