2013-03-26 3 views

ответ

12

Это та же самая логика, тот же вопрос, был сделан для C#

result = round(value*2)/2; 

И обобщать, согласно aardvarkk «s предложение, если вы хотите, чтобы округлить до ближайшего точности acc, например acc = 0.5:

acc = 0.5; 
result = round(value/acc)*acc; 
+1

Это дает правильный ответ - не мое! Я удалю свое, но я бы рекомендовал вам обобщить результат (то есть, если мы хотим округлить до ближайшего 0.05 ...) – aardvarkk

+0

да, я на самом деле набрал комментарий к вашему ответу, я отредактирую свой. –

3

Если вы переходите умножить на 2 - раунд на 2 маршрута, вы можете получить некоторые (очень маленькие) числовые ошибки. Вы можете сделать это с помощью mod, чтобы избежать этого:

x = 16.625; 
dist = mod(x, 0.5); 
floorVal = x - dist; 
newVal = floorVal; 
if dist >= 0.25, newVal = newVal + 0.5; end 

Вы могли бы сделать это за меньшее число шагов, но здесь я сломала его, так что вы можете увидеть, что каждый шаг делает.

1
a=16.625; 
b=floor(a); 
if abs(a-b-0.5) <= 0.25 
    a=b+.5; 
else 
    if a-b-0.5 < 0 
    a=b; 
    else 
    a=b+1; 
    end 
end 
Смежные вопросы