Сложение

  • Автор темы Alexfear
  • Дата начала
A

Alexfear

Гость
#1
Как сложить 2 числа тоесть 2,2+2
если начинаешь слаживать получается 4 а 0,2 отбрасывает так как прописано запятая!
Как можно этого избежать! Без запятых так как визуал бейсик ввыводит даные имено дроби через запятую!!
 

hosm

* so what *
18.05.2009
2 442
9
#2
Tanya как-то поясняла преобразование строки с дробными числами в числовой формат:
Val() всегда! преобразует строку в число. Если в строке не число, то получим 0.
Но есть некоторые особенности преобразования строки к числам с десятичным разделителем. Например,

I) системный разделить - запятая
системный разделитель в строке:
val("0,4") = 0
CDbl("0,4") =0,4
несистемный разделитель в строке:
val("0.4") = 0,4
CDbl("0.4") => Type mismatch

II) системный разделить - точка
системный разделитель в строке:
val("0.4") = 0.4
CDbl("0.4") = 0.4
несистемный разделитель в строке:
val("0,4") = 0
CDbl("0,4") =0.4

Удивительные результаты ))) т.е. по-любому нужно извращаться. Определить разделитель, и в зависимости от этого действовать!

Т.о. в конкретно приведенном вами примере нужно знать, что там вводится и как вводится.
Так например, если при системном разделителе 'запятая' ввести 0.4 и использовать CDbl(), то возникнет ошибка.
А если при любом сист. разделителе ввести 0,4 и использовать Val(), то получим некорректный результат.
Добавлено: вы ж не целочисленной переменной результат присваиваете, надеюсь?
 

Gamlet

Well-Known Member
08.01.2007
525
0
#3
Скорее всего складываете в переменную типа intriger. Если критично то умножте переменные на 10(100, 1000, смотря сколько чисел после запятой), а при выводе разделите.
 
B

BStudio

Гость
#4
Код:
Private Summand1 As Decimal = 2.2
Private Summand2 As Byte = 2  'Byte - не больше 255, Short - не больше 32767, Integer - не больше 2147483648, Long - вообще пипец =D
Private Amount As Decimal	 'Сокращайте использование оперативной памяти переменными, если не нужно большое число. (Мой совет)

Private Sub Addition()
Amount = Summand1 + Convert.ToDecimal(Summand2)
MessageBox.Show("Частное = " & Amount.ToString())
End Sub
Добавлено: ------------------------------------------------------------
А чтоб при чтении строковой переменной не было
проблем с запятыми\точками, сделайте так:

Код:
dcString = dcString.Replace(",", ".")  ' Замена в строке всех запятых на точки.
DecimalValue = Convert.ToDecimal(dcString) ' Конверт строки в десятичную переменную.