Чудеса Currency. Или как правильно произвести вычисление.

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

Чудеса Currency. Или как правильно произвести вычисление.

Сообщение shady » 12.03.2007 (Пн) 9:57

Добрый день. Подскажите пожалуйста по разного рода вычислениям в VB.
Есть формула:
Код: Выделить всё
k = SummPay / (SumSelOtgrProd - SumSelPayProd)

где SumSelOtgrProd=55133, SumSelPayProd=55000 и SummPay =133.
все они объявлены как Currency.
По всем правилам, если эти значения подставить в формулу должно получиться 1. Такого не получается.
Начал искать где может быть ошибка
Оказалось:
что Debug.Print (SumSelOtgrProd - SumSelPayProd) показывает 133,0039
а должен был показать 133 ровно
Подскажите, как с такими чудесами бороться?

З.Ы. Помнится где-то уже была на форуме схожая тема, но найти ее не смог.

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

Сообщение alibek » 12.03.2007 (Пн) 10:15

Код покажи.
Lasciate ogni speranza, voi ch'entrate.

shady
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 09.11.2005 (Ср) 11:03

Сообщение shady » 12.03.2007 (Пн) 10:23

Код: Выделить всё

For Each aChecBoxes In lvProducts.ListItems
   Counter = Counter + 1
   If aChecBoxes.Checked = True Then ' проверяем где установлена галка
      ' общая сумма поставки
      SumSelOtgrProd = SumSelOtgrProd + CCur(lvProducts.ListItems(Counter).ListSubItems(5).Text)
      Debug.Print SumSelOtgrProd
      ' общая сумма платежей
      SumSelPayProd = SumSelPayProd + CCur(lvProducts.ListItems(Counter).ListSubItems(6).Text)
      Debug.Print SumSelPayProd
    End If
Next


При этом, в этих Debug.Print-ах сумма с 2мя знаками после запятой.

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

Сообщение GSerg » 12.03.2007 (Пн) 10:51

Бессмысленный и вредный код. Потому что идёт какое-то непонятное двойное перечисление - и через For Each aChecBoxes, и через Counter.
Код: Выделить всё
For Each aChecBoxes In lvProducts.ListItems
   If aChecBoxes.Checked Then ' проверяем где установлена галка
      ' общая сумма поставки
      SumSelOtgrProd = SumSelOtgrProd + CCur(aChecBoxes.ListSubItems(5).Text)
      Debug.Print SumSelOtgrProd
      ' общая сумма платежей
      SumSelPayProd = SumSelPayProd + CCur(aChecBoxes.ListSubItems(6).Text)
      Debug.Print SumSelPayProd
    End If
Next


Покажи объявление переменных SumSelOtgrProd и SumSelPayProd.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

shady
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 09.11.2005 (Ср) 11:03

Сообщение shady » 12.03.2007 (Пн) 11:12

GSerg писал(а):Бессмысленный и вредный код. Потому что идёт какое-то непонятное двойное перечисление - и через For Each aChecBoxes, и через Counter.

Это сделано для того чтобы пользователь отметил необходимую продукцию на которую нужно разнести сумму платежа. А вычисления нужны для рассчета коэффициента (доли) каждого из выбранных изделий в оплате. Кроме лист вью можно было бы использовать и гриду конечно, но когда я его делал не догадался об этом. :( сейчас поджимают сроки, позже скорее всего переделаю.

GSerg писал(а):Покажи объявление переменных SumSelOtgrProd и SumSelPayProd


Код: Выделить всё
Private SumSelOtgrProd As Single      ' сумма отгрузки выбранных изделий
Private SumSelPayProd As Single       ' сумма оплаты выбранных изделий


Как сюда попало single не понимаю, наверное вчера вечером как-то изменил, даже и не помню...
Но признаюсь мой ксяк. :(
Исправил на Currency теперь все правильно
Теперь становится понятно все... кроме одного... где почитать про то, как VB работает с разными типами даных. Только пробывать в ручную?
Последний раз редактировалось shady 12.03.2007 (Пн) 11:16, всего редактировалось 1 раз.

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

Сообщение alibek » 12.03.2007 (Пн) 11:16

Обыкновенно работает.
Какие нюансы непонятны?
Lasciate ogni speranza, voi ch'entrate.

shady
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 09.11.2005 (Ср) 11:03

Сообщение shady » 12.03.2007 (Пн) 11:23

Ну например. Как у меня получалось -- Currency=Single-Single
результатом было 133,0039 -- следствие плавающей запятой. А дебаг показывает что числа целые из чего я делаю вывод что результатом должно стать 133 ровно (еще ко всему этому я был убежден что вычисления произвожу с одним типом данных Currency).
Это, я уверен, только 1 вариант неправильного выбора типов данных программистом, поэтому и хотелось бы знать м.б. где-то уже преведены примеры неправильного использования типов данных (не очень хочется все на себе пробывать)

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

Сообщение GSerg » 12.03.2007 (Пн) 11:25

shady писал(а):Это сделано для того чтобы пользователь отметил необходимую продукцию на которую нужно разнести сумму платежа. А вычисления нужны для рассчета коэффициента (доли) каждого из выбранных изделий в оплате.

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

shady
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 09.11.2005 (Ср) 11:03

Сообщение shady » 12.03.2007 (Пн) 11:50

GSerg писал(а):Ты не понял.
Неверна не бизнес-логика кода, а его реализация. Правильную реализацию я показал в своём посте.

Не обратил внимания... Действительно... Большое спасибо.

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

Сообщение GSerg » 12.03.2007 (Пн) 14:41

shady писал(а):Ну например. Как у меня получалось -- Currency=Single-Single
результатом было 133,0039 -- следствие плавающей запятой. А дебаг показывает что числа целые из чего я делаю вывод что результатом должно стать 133 ровно

:roll:
http://bbs.vbstreets.ru/viewtopic.php?t=20753
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас


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

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

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

    TopList