Эта операция должна возвращать 2
, но он возвращает 1
вместо из-за представления с плавающей запятой:значащих десятичные цифры (или 0,3 - 0,1 = 0,1)
a <- .3
b <- .1
floor((a-b)*10)
Я в принципе хочет первую цифру после точки, фактического результата базы-10, а не результата компьютера с плавающей запятой. В этом случае a
и b
имеют только одну десятичную цифру, но в большинстве случаев их будет больше. Примеры:
0.3-0.1=0.2
поэтому я хочу, чтобы2
0.5-0.001=0.499
поэтому я хочу, чтобы4
0.925-0.113=0.812
поэтому я хочу8
0.57-0.11=0.46
поэтому я хочу4
0.12-0.11=0.01
поэтому я хочу0
То есть, не округление, но усечение. Я думал об использовании этого:
floor(floor((a-b)*100)/10)
но я не уверен, что это лучшее, что я могу сделать.
обновление: действительно, он не работает (см комментарии ниже):
floor(floor((.9-.8)*100)/10) # gives 0 instead of 1
floor(round((.5-.001)*100)/10) # gives 5 instead of 1
обновление 2: думаю, что это действительно работает (по крайней мере, во всех случаях, перечисленных до сих пор):
substring(as.character(a-b),first=3,last=3)
Предложения?
когда вы хотите, чтобы значение округляется вверх, и когда вы хотите, чтобы не быть? Вам нужно лучше определить желаемое поведение. Например, что должно быть возвращено '.5 - .001' и как вы это отличаетесь от' .3 - .1'? –
Это не округление, просто усечение. См. Примеры в отредактированном вопросе –
Да, похоже, что это просто усекается, но из-за того, что хранится '.3 - .1', вам нужно округлить, чтобы получить' .2'. О, и попробуйте свою последнюю попытку на '1-.9' или' .9-.8'. Это сложнее, чем кажется. –