Преобразование CSng()

Программирование на Visual Basic for Applications
jetcom
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 181
Зарегистрирован: 12.01.2003 (Вс) 23:15
Откуда: Russia, Novorossiysk

Преобразование CSng()

Сообщение jetcom » 22.04.2003 (Вт) 1:32

При преобразовании, к примеру, строкового значения "0,3" к вышеуказанному типу, получаем: "0,300000011920929".
Можно, конечно, в Excel через Сервис-Параметры-Вычисления поставить птицу "Точность, как на экране", но кривовато это.
Как грамотно избавиться от этой бяки, и откуда она берётся?
Всё сбудется!!!

corgi
ToyMan
ToyMan
 
Сообщения: 1367
Зарегистрирован: 01.10.2002 (Вт) 9:59
Откуда: Россия, Москва

Сообщение corgi » 22.04.2003 (Вт) 8:27

странно у меня вроде все нормально
ps попробуй CDbl()
Ничто так не ограничивает полёт мысли программиста, как компилятор

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 22.04.2003 (Вт) 8:40

И у меня нормально...
Попробуй округление, примерно так:
Код: Выделить всё
Dim IP as Integer, I as Integer, V as Single, Z as String
Z="0.3"
V=CSng(Z)
Z=Trim$(Str$(V))
IP=InStr(Z,".") 'позиция десятичной точки
If IP>0 Then
  I=InStr(IP+1,Z,"000") 'есть ли после десятичной точки больше двух нулей подряд
  If I>0 Then
    V=Round(V,I-IP) 'если да, то отбросить округлить
  End If
End If


corgi, классная у тебя подпись :)
Lasciate ogni speranza, voi ch'entrate.

jetcom
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 181
Зарегистрирован: 12.01.2003 (Вс) 23:15
Откуда: Russia, Novorossiysk

Сообщение jetcom » 26.04.2003 (Сб) 1:49

2corgi: Спасибо! Я не поверил своим глазам, но CDbl() действительно помогло!
Знать бы еще, почему CSng() в моем случае оказлось кривым, ведь я ему так часто верил! :roll:
2alibek: Аналогичное спасибо, это тоже вариант, но, сам понимаешь, выбор всегда падает на более простое решение проблемы!... :wink:
Всё сбудется!!!

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 26.04.2003 (Сб) 7:47

Знать бы еще, почему CSng() в моем случае оказлось кривым, ведь я ему так часто верил!


Когда читал я в мануале, что последние две-три цифры Single и Double не являются точными. Соответственно, поскольку цифр у Double больше, то и точность выше. Наверняка ошибка возникает и там, просто она настолько мала, что игнорируется.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

corgi
ToyMan
ToyMan
 
Сообщения: 1367
Зарегистрирован: 01.10.2002 (Вт) 9:59
Откуда: Россия, Москва

Сообщение corgi » 26.04.2003 (Сб) 11:32

что single что и double хранятся в виде числа и степени в которую это дело надо возвести поэтому ошибки будут всегда. И эти типы данных никода не равны нулю, т.к. существуют погрешности но по идее для single она должна быть равна где-то Е-45 и и поэтому не должна влиять на конечное значение почему она у тебя оказалась Е-7 это действительно вопрос интересный :?: :?:
Ничто так не ограничивает полёт мысли программиста, как компилятор

jetcom
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 181
Зарегистрирован: 12.01.2003 (Вс) 23:15
Откуда: Russia, Novorossiysk

Сообщение jetcom » 26.04.2003 (Сб) 12:02

2corgi: Посмотри, может у тебя стояла птица "Точность как на экране", поэтому ничего не проявилось. Но, как ни странно, а это факт! После ваших пояснений хоть понятно, из-за чего эта бяка появлялась...
Всё сбудется!!!

corgi
ToyMan
ToyMan
 
Сообщения: 1367
Зарегистрирован: 01.10.2002 (Вт) 9:59
Откуда: Россия, Москва

Сообщение corgi » 26.04.2003 (Сб) 12:38

да действительно если вывести на экра с максимальной точностью то появляется эта байда :?: :!: Отсюда делаем вывод что пользоваться single не следует и нет проблем :D
Ничто так не ограничивает полёт мысли программиста, как компилятор


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 51

    TopList