Аццкий Abs

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Аццкий Abs

Сообщение Nicky » 31.10.2006 (Вт) 8:08

Код: Выделить всё
Private Sub Form_Load()
  Debug.Print Int(Abs(132.1 * (-5 / 100)) * 100 + 0.5) / 100
  Debug.Print Int(myAbs(132.1 * (-5 / 100)) * 100 + 0.5) / 100
End Sub

'мой вариант выхода из положения
Function myAbs(f)
  myAbs = f * IIf(f < 0, -1, 1)
End Function

Вот такая подстава :(
Кто-то еще наступал на эти грабли?

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 31.10.2006 (Вт) 8:29

посмотри вот эти варианты:

Код: Выделить всё
Debug.Print Int(CDbl(Abs(132.1 * (-5 / 100))) * 100# + 0.5) / 100
Debug.Print Int(CDbl(myAbs(132.1 * (-5 / 100))) * 100# + 0.5) / 100
Весь мир матрица, а мы в нем потоки байтов!

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 31.10.2006 (Вт) 8:39

!Viper! писал(а):посмотри вот эти варианты:

Код: Выделить всё
Debug.Print Int(CDbl(Abs(132.1 * (-5 / 100))) * 100# + 0.5) / 100
Debug.Print Int(CDbl(myAbs(132.1 * (-5 / 100))) * 100# + 0.5) / 100

Неправильные ответы. Правильный вот этот
Debug.Print Int(myAbs(132.1 * (-5 / 100)) * 100 + 0.5) / 100

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

Сообщение alibek » 31.10.2006 (Вт) 8:44

А в чем вопрос?
Lasciate ogni speranza, voi ch'entrate.

NashRus
Постоялец
Постоялец
 
Сообщения: 388
Зарегистрирован: 18.03.2006 (Сб) 1:16

Сообщение NashRus » 31.10.2006 (Вт) 8:47

а в чем грабли ?

так вообще одинаково дает:

Debug.Print CInt(Abs(132.1 * (-5 / 100)) * 100 + 0.5) / 100
Debug.Print Int(myAbs(132.1 * (-5 / 100)) * 100 + 0.5) / 100


а так писать:

Function myAbs(f)


ваЩе не надо.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 31.10.2006 (Вт) 8:48

А такая последовательность не пойдет?

Код: Выделить всё
Debug.Print Abs(Int(132.1 * -5 / 100 * 100) + 0.5)
Debug.Print myAbs(Int(132.1 * -5 / 100 * 100) + 0.5)


З.Ы. что-то я не совсем пойму что хочет автор? Где логика в расстановке скобок и использования функций Abs и Int?
Весь мир матрица, а мы в нем потоки байтов!

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 31.10.2006 (Вт) 9:00

alibek писал(а):А в чем вопрос?

Вопрос в том, почему Print'ы в первом посте дают разные ответы? (правильный-второй)

NashRus писал(а):а в чем грабли ?

так вообще одинаково дает:

Debug.Print CInt(Abs(132.1 * (-5 / 100)) * 100 + 0.5) / 100
Debug.Print Int(myAbs(132.1 * (-5 / 100)) * 100 + 0.5) / 100


Упс! CInt прокатила, хотя она округляет фракцию, а мне этого не надо

NashRus писал(а):а так писать:

Function myAbs(f)


ваЩе не надо.

Интересно, почему?

!Viper! писал(а):А такая последовательность не пойдет?

Код: Выделить всё
Debug.Print Abs(Int(132.1 * -5 / 100 * 100) + 0.5)
Debug.Print myAbs(Int(132.1 * -5 / 100 * 100) + 0.5)


З.Ы. что-то я не совсем пойму что хочет автор? Где логика в расстановке скобок и использования функций Abs и Int?

Нет, не пойдет, совсем не по теме :)
Я хочу высчитать скидку по чеку. Сумма чека 132.10, скидка 5%, какова сумма скидки?

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 31.10.2006 (Вт) 9:09

Ужос.... А 132.10 умножить на 0.05 религия не позволяет :?:

Код: Выделить всё
Debug.Print 132.1*0.05


И если уж сосвсем точно, то

Код: Выделить всё
Debug.Print Format$(132.1 * 0.05, "0.00")
Весь мир матрица, а мы в нем потоки байтов!

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 31.10.2006 (Вт) 9:38

!Viper! писал(а):Ужос.... А 132.10 умножить на 0.05 религия не позволяет :?:

Код: Выделить всё
Debug.Print 132.1*0.05


И если уж сосвсем точно, то

Код: Выделить всё
Debug.Print Format$(132.1 * 0.05, "0.00")


Постыдил, да? :)
И все-таки, почему Print'ы в первом посте дают разные ответы?

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

Сообщение alibek » 31.10.2006 (Вт) 9:51

Потому что не надо работать с плавающей запятой, как с целым числом.
Lasciate ogni speranza, voi ch'entrate.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 31.10.2006 (Вт) 10:06

Резюме вышесказанного: для финансовых вычислений есть специальный тип Currency, который и необходимо юзать в данном случае. Кстати достаточно недавно это вопрос уже всплывал.
Весь мир матрица, а мы в нем потоки байтов!

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 31.10.2006 (Вт) 10:22

Всем спасибо!
Некий туман остался, но Format рулит :)

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

Сообщение alibek » 31.10.2006 (Вт) 10:48

Никакого тумана.
Просто всегда помни, что 661# это не 661. Это 661±e, где e близко к 0, но не обязательно равно ему. Если e будет -0.000000000000001, то Int как раз и даст тот результат, который у тебя получился.
Lasciate ogni speranza, voi ch'entrate.

alzasr
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 05.12.2008 (Пт) 7:55

Re: Аццкий Abs

Сообщение alzasr » 14.08.2009 (Пт) 13:09

А можете объяснить почему? Из сказанного выше я понимаю, что
Dim a as Double, b as Long
a = 611
b = 611

то может случиться (при условии, что с переменными других действий не выполняли), что a<>b? Или только Int(a)<>b?

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

Re: Аццкий Abs

Сообщение alibek » 14.08.2009 (Пт) 13:28

Теоретически может.
Числа с плавающей запятой (Single, Double) вообще нельзя сравнивать на равенство.
Lasciate ogni speranza, voi ch'entrate.


Вернуться в Visual Basic 1–6

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

Сейчас этот форум просматривают: Yandex-бот и гости: 90

    TopList