отбрасывание цифр, а не округление

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 27.07.2006 (Чт) 11:06

Gmp писал(а):В качестве компромиса предлагаю:
Dim i As Double
i = Cstr(22.343677)
i = Left$(i, Len(FormatNumber(i, 3)))

что скажешь?

Для числа 99.999999 уже не работает.
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 27.07.2006 (Чт) 11:12

А мой работает 8)
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

~Ilya~
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 09.03.2006 (Чт) 14:34

Сообщение ~Ilya~ » 27.07.2006 (Чт) 12:15

Коллеги! Поясните плз, чем отличается Mid$ от Mid, что за фиговины num$, i% ?

Насчет национальных систем исчисления - все-таки хочется чтобы программа была как можно более надежной и независимой от остального ПО на компе. IMHO.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 27.07.2006 (Чт) 12:20

эти "фигня" есть TDC или ТОС (type-declaration character / типо-определительные символы).

Чтобы не писать
Dim num as integer
num = 566

можно коротко написать
num% = 566

чтобы не писать
Dim strstr As String
strstr="ad"
пишут
strstr$ = "ad"
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Сообщение Viper » 27.07.2006 (Чт) 12:22

а Mid отличается от Mid$ тем, что первый вариант работает с типом Variant, а второй с типом String. И делает это быстрее.
Весь мир матрица, а мы в нем потоки байтов!

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 27.07.2006 (Чт) 12:27

Хакер писал(а):Чтобы не писать
Dim num as integer
num = 566

можно коротко написать
num% = 566

Низя, Option Explicit не даст.
Изображение

~Ilya~
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 09.03.2006 (Чт) 14:34

Сообщение ~Ilya~ » 27.07.2006 (Чт) 12:33

Спасибо за пояснения!

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 27.07.2006 (Чт) 12:35

это только у извращенцев которые пишет Option Explicit, потому что забывают имена переменных и могут где то допустит ошибку и написать user_data вместо userdata.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Сообщение Viper » 27.07.2006 (Чт) 12:37

tyomitch писал(а):
Хакер писал(а):Чтобы не писать
Dim num as integer
num = 566

можно коротко написать
num% = 566

Низя, Option Explicit не даст.


но можно написать:

Код: Выделить всё
Dim n%
n%=100

и n будет являтся типом Integer
Весь мир матрица, а мы в нем потоки байтов!

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 27.07.2006 (Чт) 13:23

Можно даже
Код: Выделить всё
Dim n%
n = 100
Изображение

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

Сообщение Nicky » 27.07.2006 (Чт) 13:27

Хакер писал(а):это только у извращенцев которые пишет Option Explicit, потому что забывают имена переменных и могут где то допустит ошибку и написать user_data вместо userdata.

Вот так легко взял и половину записал в извращенцы :evil:

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 27.07.2006 (Чт) 13:48

Уверен, что не половину, а гораздо больше...
Изображение

Gmp
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 68
Зарегистрирован: 22.07.2006 (Сб) 17:04
Откуда: Германия

Сообщение Gmp » 27.07.2006 (Чт) 19:25

tyomitch писал(а):Для числа 99.999999 уже не работает.


тогда можно так:

Код: Выделить всё
Dim i As Double
i = 99.999999
i = Left$(CStr(i), Len(CStr(Fix(i))) + 4)


3 знака

Gmp
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 68
Зарегистрирован: 22.07.2006 (Сб) 17:04
Откуда: Германия

Сообщение Gmp » 27.07.2006 (Чт) 20:28

А вот от зашедшего ко мне соседа программиста со стажем. :)

Dim i As Double
i = 34.358944554454
i = Sgn(i) * (Int((Abs(i) * 1000)) / 1000)

3 знака. :)
Последний раз редактировалось Gmp 27.07.2006 (Чт) 20:31, всего редактировалось 1 раз.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 27.07.2006 (Чт) 20:30

Gmp, в моём первом ответе был такой же код.
Изображение

Saturn.65
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 543
Зарегистрирован: 13.10.2006 (Пт) 18:46

Re: отбрасывание цифр, а не округление

Сообщение Saturn.65 » 14.01.2009 (Ср) 18:14

Искал в Format но ничего не нашел.
Суть такая. Когда при расчете получается отрицательное число, то об этом говорит MsgBox.
Код: Выделить всё
MsgBox "Перерасход" + Text1.Text, vbExclamation, "Итог"

Как бы сделать так, чтоб при выводе отрицательного числа не показывался бы минус? А то получается некорректно: Перерасход -100 руб. :?
Главное, ребята, сердцем не стареть...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: отбрасывание цифр, а не округление

Сообщение Хакер » 14.01.2009 (Ср) 18:17

Код: Выделить всё
x = -100
MsgBox "У меня не хватает " + CStr(x) + " долларов"
MsgBox "У меня не хватает " + CStr(-x) + " долларов"
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: отбрасывание цифр, а не округление

Сообщение iGrok » 14.01.2009 (Ср) 18:55

Хакер писал(а):
Код: Выделить всё
x = -100
MsgBox "У меня не хватает " + CStr(x) + " долларов"
MsgBox "У меня не хватает " + CStr(-x) + " долларов"

Ещё наверное можно заюзать Abs(x)...
label:
cli
jmp label

Saturn.65
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 543
Зарегистрирован: 13.10.2006 (Пт) 18:46

Re: отбрасывание цифр, а не округление

Сообщение Saturn.65 » 14.01.2009 (Ср) 20:06

Хакер писал(а):
Код: Выделить всё
x = -100
MsgBox "У меня не хватает " + CStr(x) + " долларов"
MsgBox "У меня не хватает " + CStr(-x) + " долларов"

Спасибо большое! Хакер -голова! Отдельно работает, но не в моем поекте.
У меня стоит таймер на MsgBox и MsgBox через несколько секунд сам закрывается.
А когда подставляю это: MsgBox("Перерасход " + CStr(-Text26.Text), vbExclamation, "Перерасход!") = vbOK ' Compile error выскакивает :(
Вот родной код
Код: Выделить всё
'модуль
Public Declare Function SetTimer Lib "user32" (ByVal hWnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Private Declare Function KillTimer Lib "user32" (ByVal hWnd As Long, ByVal nIDEvent As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hWnd As Long) As Long
Public Const NV_CLOSEMSGBOX As Long = &H5000&
Public Sub TimerProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal idEvent As Long, ByVal dwTime As Long)
KillTimer hWnd, idEvent
Select Case idEvent
Case NV_CLOSEMSGBOX
Dim hMessageBox As Long
hMessageBox = FindWindow("#32770", "Перерасход!")
If hMessageBox Then
Call SetForegroundWindow(hMessageBox)
SendKeys "{enter}"
End If
End Select
End Sub
---------------------------------------
'Код
Private Sub Command27_Click()
Per = 2 * 1000
'вместо цифры 4 введите любое число, через какое время необходимо закрыть окно (в миллисекундах)
SetTimer hWnd, NV_CLOSEMSGBOX, Per, AddressOf TimerProc
'Если хотите изменить заголовок "MsgBox" на что-нибудь другое, то произведите
'эту замену и в модуле в строке hMessageBox = FindWindow("#32770", "MsgBox")

MsgBox("Перерасход " + CStr(-Text26.Text), vbExclamation, "Перерасход!") = vbOK  ' Compile error
'Function call on left-hand side of
'assigment must return Variant or Object
MsgBox "Перерасход  " + Text26.Text, vbExclamation, "Перерасход!"   'А это работает
End Sub
Главное, ребята, сердцем не стареть...

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: отбрасывание цифр, а не округление

Сообщение tyomitch » 14.01.2009 (Ср) 20:27

Мдаааа....

MsgBox("Перерасход " &-Val(Text26.Text), vbExclamation, "Перерасход!") = vbOK
Изображение

Saturn.65
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 543
Зарегистрирован: 13.10.2006 (Пт) 18:46

Re: отбрасывание цифр, а не округление

Сообщение Saturn.65 » 14.01.2009 (Ср) 20:50

tyomitch писал(а):Мдаааа....
MsgBox("Перерасход " &-Val(Text26.Text), vbExclamation, "Перерасход!") = vbOK

Большое спасибо! Хотя тоже не правильно было и ошибку выдавало.
Вот так стало работать: MsgBox "Перерасход " & -Val(Text26.Text) & " руб.", vbExclamation, "Перерасход!"
Вот так через тернии и иду к звездам. :? Стыдно конечно, но куда деваться? Нигде больше не помогут.
Главное, ребята, сердцем не стареть...

Megas13
Новичок
Новичок
Аватара пользователя
 
Сообщения: 40
Зарегистрирован: 03.08.2006 (Чт) 9:46
Откуда: IL

Re: отбрасывание цифр, а не округление

Сообщение Megas13 » 15.01.2009 (Чт) 0:47

iGrok правильно сказал. Зачем парится если можно просто вызвать Abs() ?
Компьютер не подчиняется законам физики.Только в нем глюки возникают из ничего, файлы исчезают в никуда, а объем измеряется в метрах и называется весом.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: отбрасывание цифр, а не округление

Сообщение Денис » 15.01.2009 (Чт) 9:28

Megas13 писал(а):iGrok правильно сказал. Зачем парится если можно просто вызвать Abs() ?

Человек через тернии пробирается, не видишь, что-ли? :roll: Мешать не будем, и даже поможем:
Код: Выделить всё
MsgBox "Перерасход" + (-1 * val(Text1.Text)), vbExclamation, "Итог"

настоящий терновый куст^
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Saturn.65
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 543
Зарегистрирован: 13.10.2006 (Пт) 18:46

Re: отбрасывание цифр, а не округление

Сообщение Saturn.65 » 30.01.2009 (Пт) 11:31

По поводу формата хотел спросить. У меня в Text1.Text выводится десятичное число, например 1,455.
При записи в реестр
Код: Выделить всё
Reg1.SetValue HKEY_CURRENT_USER, "Software\Proga", "sh(0)", Val(Text1.Text), REG_SZ

число округляется до 1. Как только не бился, но причину нашел. Если бы в Text1.Text выводилось число с точкой 1.455, то в реестр бы оно записывалось без обкругления. Но когда запятая, то происходит округление.
Как бы форматировать запятую в точку при записи в Text1.Text?
Главное, ребята, сердцем не стареть...

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

Re: отбрасывание цифр, а не округление

Сообщение Viper » 30.01.2009 (Пт) 12:51

Saturn.65 писал(а):Как бы форматировать запятую в точку при записи в Text1.Text?
Replace$ использовать не пробовал?
Кстати, зацени вот такую штуку:Format$(0, ".")-возвращает текущий разделитель целой и дробной частей.
З.Ы. Просветляться чтением моей статьи на основном сайте. Там много полезного есть.
Весь мир матрица, а мы в нем потоки байтов!

Saturn.65
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 543
Зарегистрирован: 13.10.2006 (Пт) 18:46

Re: отбрасывание цифр, а не округление

Сообщение Saturn.65 » 30.01.2009 (Пт) 21:22

Нашел ошибку. Надо было Val убрать и все будет писаться.
Код: Выделить всё
Reg1.SetValue HKEY_CURRENT_USER, "Software\Proga", "sh(0)", Text1.Text, REG_SZ
Главное, ребята, сердцем не стареть...

Saturn.65
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 543
Зарегистрирован: 13.10.2006 (Пт) 18:46

Re: отбрасывание цифр, а не округление

Сообщение Saturn.65 » 10.05.2009 (Вс) 15:55

Реально ли проделать такое форматирование или сокращение или округление, не знаю, как правильно назвать. Например если число 246 то оно должно быть после форматирования 250. Если 244, то тогда 240. Т.е. сокращать-округлять как бы целые числа.
Вся процедура должна проводится с последней цифрой числа.
Главное, ребята, сердцем не стареть...

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Re: отбрасывание цифр, а не округление

Сообщение dr.MIG » 10.05.2009 (Вс) 16:13

Код: Выделить всё
Dim a As Double
a = 255
a = Round(a / 100, 1) * 100
Salus populi suprema lex

Saturn.65
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 543
Зарегистрирован: 13.10.2006 (Пт) 18:46

Re: отбрасывание цифр, а не округление

Сообщение Saturn.65 » 10.05.2009 (Вс) 18:22

Cпасибо dr.MIG.
Не совсем правильно работает или я что-то не так делал.
Немного поворочал извилиной и руками и родил такое:
Код: Выделить всё
Private Sub Command1_Click()
Dim a As Double
a = Text1.Text
Text1.Text = Round(a / 10) * 100 / 10
End Sub

Если вводишь любую цифру, то последняя цифра округляется.
Это самый раз. :D
Главное, ребята, сердцем не стареть...

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Re: отбрасывание цифр, а не округление

Сообщение dr.MIG » 10.05.2009 (Вс) 18:57

А почему самому не посчитать, чему равно 100 / 10? :)
Saturn.65 писал(а):Round(a / 10) * 100 / 10

=Round(a / 10) * 10

Add: и судя по тому, что ты сказал, что мой вариант работает не совсем правильно, то есть мнение, что тебе скорее нужен такой вариант:
Код: Выделить всё
Private Sub Command1_Click()
    Dim a As Double
    a = Text1.Text
    a = Int(a / 10 + 0.5) * 10
    Text1.Text = a
End Sub


Поясни, какое тебе нужно округление — в последнем варианте 145 округлится до 150, 155 до 160, а в твоем варианте 145 до 140, 155 до 160... И еще что касается отрицательных чисел — будут ли они использоваться и как они должны округляться?
Salus populi suprema lex

Пред.След.

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

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

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

    TopList