Страница: 1 | 2 | 
		
		 
			   
			 
			 
			 
			 
			
 
  
		
     
  
    
Вопрос: Про математику... 0,5 - 0,4 не равно 0,1 ???
     
    
Добавлено: 11.06.11 21:50
     
      
  
				
			  
					 
			
				 
    
		
       
    
Автор вопроса:  
    
 DimBi
      
       
  
Как правильно выполнять математические вычисления?
 
    
У меня получается, что:
0,5 - 0,4 = 0,099999999999999978
проверял кодом:
        Dim y As Double = 0.4
        Dim z As Double
        z = x - y
        If z = 0.1 Then
            Lbresult.Text = "равно"
        Else
            Lbresult.Text = "Не равно"
        End If
Почему так получается? Что надо сделать?
				
		
		
					 
			
				 
  
		
     
  
    
Ответы
     
    
Всего ответов: 18
     
      
  
		
	  
			 
	
		 
    
       
    
Номер ответа: 1 
      
Автор ответа:
 AWP
![]()
ICQ: 345685652 
Вопросов: 96
Ответов: 1212
      
 Web-сайт:  
 Профиль |  | #1
      
Добавлено:  11.06.11 22:22
       
    
       
  
самое простое. Сделай " 
    
im z As Single"
		
	  
			 
	
		 
    
       
    
Номер ответа: 2 
      
Автор ответа:
 DimBi
![]()
![]()
![]()
![]()
![]()
![]()
Вопросов: 15
Ответов: 55
      
 Профиль |  | #2
       
Добавлено:  11.06.11 22:33
       
    
       
  
к сожалению  
    
Решил так:
(количество знаков после запятой на результат не влияет, просто округляет 0,09999.... к 0,1)
но, хотелось бы понять, почему так происходит?
		
	  
			 
	
		 
    
       
    
Номер ответа: 3 
      
Автор ответа:
 FedX
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
ICQ: 578776900 
Вопросов: 4
Ответов: 10
      
 Профиль |  | #3
       
Добавлено:  11.06.11 22:46
       
    
       
  
А можно еще вот так:
 
    
		
	  
			 
	
		 
    
       
    
Номер ответа: 4 
      
Автор ответа:
 Ким Чен Ир
![]()
Вопросов: 0
Ответов: 140
      
 Профиль |  | #4
       
Добавлено:  11.06.11 22:52
       
    
       
  
 
    
Корень проблемы в стандарте IEEE-754, определяющем формат чисел с плавающей точкой.
Типы Double и Single его придерживаются и получают за это, что причитается.
		
	  
			 
	
		 
    
       
    
Номер ответа: 5 
      
Автор ответа:
 DimBi
![]()
![]()
![]()
![]()
![]()
![]()
Вопросов: 15
Ответов: 55
      
 Профиль |  | #5
       
Добавлено:  11.06.11 23:32
       
    
       
  
 И так не получится....
 
    
		
	  
			 
	
		 
    
       
    
Номер ответа: 6 
      
Автор ответа:
 DimBi
![]()
![]()
![]()
![]()
![]()
![]()
Вопросов: 15
Ответов: 55
      
 Профиль |  | #6
       
Добавлено:  11.06.11 23:36
       
    
       
  
 
    
как же решается проблема?
Неужели пересчитывать каждое действие на этапе разработки?!
Может, какие правила есть?
		
	  
			 
	
		 
    
       
    
Номер ответа: 7 
      
Автор ответа:
 Ким Чен Ир
![]()
Вопросов: 0
Ответов: 140
      
 Профиль |  | #7
       
Добавлено:  11.06.11 23:41
       
    
       
  
Ну почему же, ты сам ведь понял, что нужно правильное округление и контроль значимых разрядов
 
    
		
	  
			 
	
		 
    
       
    
Номер ответа: 8 
      
Автор ответа:
 Ким Чен Ир
![]()
Вопросов: 0
Ответов: 140
      
 Профиль |  | #8
       
Добавлено:  11.06.11 23:50
       
    
       
  
Кроме того, есть тип Decimal.
 
    
		
	  
			 
	
		 
    
       
    
Номер ответа: 9 
      
Автор ответа:
 DimBi
![]()
![]()
![]()
![]()
![]()
![]()
Вопросов: 15
Ответов: 55
      
 Профиль |  | #9
       
Добавлено:  11.06.11 23:58
       
    
       
  
Вот что нашел про этот стандарт:
 
    
всю статью можно почитать здесь: http://www.vbstreets.ru/VB/Articles/66541.aspx
		
	  
			 
	
		 
    
       
    
Номер ответа: 10 
      
Автор ответа:
 AWP
![]()
ICQ: 345685652 
Вопросов: 96
Ответов: 1212
      
 Web-сайт:  
 Профиль |  | #10
      
Добавлено:  12.06.11 01:00
       
    
       
  
Стоить отметить, что в VB6 числа с плавающей точкой вычисляются нормально.
 
    
		
	  
			 
	
		 
    
       
    
Номер ответа: 11 
      
Автор ответа:
 Ким Чен Ир
![]()
Вопросов: 0
Ответов: 140
      
 Профиль |  | #11
       
Добавлено:  12.06.11 01:24
       
    
       
  
Ну, достаточно ведь одного примера, чтобы опровергнуть.
 
    
		
	  
			 
	
		 
    
       
    
Номер ответа: 12 
      
Автор ответа:
 AWP
![]()
ICQ: 345685652 
Вопросов: 96
Ответов: 1212
      
 Web-сайт:  
 Профиль |  | #12
      
Добавлено:  12.06.11 03:20
       
    
       
  
Да, одного хватает...
 
    
		
	  
			 
	
		 
    
       
    
Номер ответа: 13 
      
Автор ответа:
 Ким Чен Ир
![]()
Вопросов: 0
Ответов: 140
      
 Профиль |  | #13
       
Добавлено:  12.06.11 03:42
       
    
       
  
Не ты ли говорил :  
    
А теперь решил раздвинуть границы?
Есть такое понятие "фальсифициуемая теория". Можешь приводить сотню подтверждений, но достаточно одного опровержения. 
Мне время тратить или сам поищешь?
		
	  
			 
	
		 
    
       
    
Номер ответа: 14 
      
Автор ответа:
 Ким Чен Ир
![]()
Вопросов: 0
Ответов: 140
      
 Профиль |  | #14
       
Добавлено:  12.06.11 05:23
       
    
       
  
|A|W|P| обиделся наверно. Извини. 
    
Хоть числа представленные операндами a и b условно "большие", они и рядом не стоят с предельно допустимыми для double +/–1.7E308.
А результат тем более ... 
И это просто вычитание. А что будет при умножении/делении, да с итерациями...
		
	  
			 
	
		 
    
       
    
Номер ответа: 15 
      
Автор ответа:
 DimBi
![]()
![]()
![]()
![]()
![]()
![]()
Вопросов: 15
Ответов: 55
      
 Профиль |  | #15
       
Добавлено:  12.06.11 10:46
       
    
       
  
вчера сервер перестал отвечать....
 
    
теперь видимо без костылей никак:
или, если Decimal: