Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
kris
Зарегистрирован: 12.01.2006 Сообщения: 371
|
Добавлено: Вс Окт 30, 2011 11:36 am Заголовок сообщения: Бага в Round2? |
|
|
Есть такой код:
Код: | Option Explicit
MsgBox NumericToXML(CDbl(8500))
MsgBox NumericToXML(8500)
' Конвертирует число в строку, умноженную на 10000
Private Function NumericToXML(Val)
If IsNumeric(Val) Then
Val = Round2(Val,4) ' так глючит
' Val = CCur(Val) ' так работает нормально
NumericToXML = CStr(CDbl(Fix(Val))*10000 + (Val - Fix(Val)) * 10000)
End If
End Function |
Кто-нибудь объяснит мне, почему CDbl(8500) округляется с хвостиком в хрен-знает-каком-знаке, а просто 8500 - без хвостиков? Выкрутился принудительным преобразованием в Currency вместо округления, но все-таки хотелось бы понимать, откуда ноги растут.
P.S. Когда-то встречался с таким поведением Double, но тогда это явно было связано с "приближенностью" типа. Не думал, что это проявляется и в Round'e. |
|
Вернуться к началу |
|
|
olimp Site Admin
Зарегистрирован: 10.03.2005 Сообщения: 2661
|
Добавлено: Пт Ноя 04, 2011 10:28 am Заголовок сообщения: Re: Бага в Round2? |
|
|
kris писал(а): |
MsgBox NumericToXML(CDbl(8500))
MsgBox NumericToXML(8500)
[/code]
Кто-нибудь объяснит мне, почему CDbl(8500) округляется с хвостиком в хрен-знает-каком-знаке, а просто 8500 - без хвостиков?
|
Потому что 8500 VB преобразовывает в целое число. Напиши
MsgBox NumericToXML(8500.)
MsgBox NumericToXML(8500)
и получишь в функции такой же глюк. |
|
Вернуться к началу |
|
|
kris
Зарегистрирован: 12.01.2006 Сообщения: 371
|
Добавлено: Пт Ноя 04, 2011 2:12 pm Заголовок сообщения: |
|
|
Это я понимаю.
Что меня удивляет, так это "спонтанность и непредсказуемость" double. Вот сейчас запустил тот же код, что в моем прошлом посте - нет ошибки! Где правда? |
|
Вернуться к началу |
|
|
|