2016-11-11 12 views
5

Что-то вызывает неожиданные результаты на моей компании давно, и я нашел эту проблему:VB6 Круглый (х, 0) вопрос

Dim k As Double 
Dim r As Integer 
k = 182.5 
r = Round(k,0) 

Результат т 182, это вызвало проблемы в моей компании и сейчас я должен это исправить.

Дело в том, что я наблюдал это:

Dim k As Double 
Dim r As Integer 
k = 186.5 
r = Round(k,0) 

г = 187

Когда единств целочисленной части двойного больше, чем пять, раунд делает то, что я ожидал, но это Безразлично 't для единиц < = 5.

Как я могу решить эту проблему? Есть ли еще одна функция для правильного округления?

+0

http://stackoverflow.com/questions/647762/automatic-type-conversion-in-visual-basic-6-0 – MarkJ

+0

В этом случае я буду использовать 'r = int (k + 0,5)' – SBF

ответ

6

Это называется банкиры округляют и пытаются распределить округление вверх/вниз на .5 исходя из того, является ли ближайшее число нечетным или четным.

сгонять на .5:

cint(format(182.5, "#0")) ''183 
cint(format(186.5, "#0")) ''187 
+0

One следует отметить, однако, что Format $ преобразует double в String, из которого он должен быть преобразован обратно в Int. Это очень неэффективно. Формат (без знака $) еще хуже, потому что он создает вариант. – Herb

1

Ну, во-первых, это не так, как вы говорите.

k = 182.5 
r = Round(k, 0) 

действительно производят 182, но

k = 186.5 
r = Round(k, 0) 

будет производить 186, а не 187, как вы говорите. Теперь

k = 185.5 
r = Round(k, 0) 

также даст 186. Это называется Banker's Rounding и является стандартом в VB6. Цель состоит в том, чтобы отменить смещение, всегда округляя точную середину.

Если вы хотите всегда округляет 0,5 до, используйте

k = 186.5 
r = Int(k * 2 + 1) \ 2 

Если вы хотите, чтобы всегда округляет 0,5 вниз, вы можете использовать что-то вдоль линии

k = 186.5 
r = Int(k * 2 + 0.99) \ 2 

Добавьте столько 9s, как после десятичной точки есть значащие цифры.

 Смежные вопросы

  • Нет связанных вопросов^_^