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

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

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

Сообщение ~Ilya~ » 20.07.2006 (Чт) 16:07

Недавно мне понадобиллсь форматировать числа (single, double, currency), причем в некоторых случаях их нужно
- округлить, что я делаю с помощью функции Round
- в некоторых случая оcтавить ровно N цифр(не округляя)
- а иногда округлить вниз(!) т.е. 1.54->1.5 1.55 -> 1.5 1.56-> 1.6

Вопрос: можно ли это сделать встроенными в VB функциями, например вроде Round или написать какое-то форматирование для функции Format?

Вопрос2: данные потом кладутся в файл Excel, можно ли в ячейке сделать такое форматирование?

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

Сообщение tyomitch » 20.07.2006 (Чт) 17:34

2) Int(v*10^N)/10^N
3) округление вниз(!) -- это совсем другое: это когда 1.56 -> 1.5
Изображение

XPAHuTEJIb
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 12.07.2006 (Ср) 15:04
Откуда: Новый Уренгой

Сообщение XPAHuTEJIb » 20.07.2006 (Чт) 19:42

по поводу округления вниз:
Код: Выделить всё
'исходное число
v = 123.35554545
'выделяем дробную часть
x = (v - Int(v)) * 10   'чем больше надо оставить чисел после запятой
x = (x - Int(x)) / 10    'тем, соответственно, больше нулей после 1
'вычитаем дробную часть
x = v - x

2) Int(v*10^N)/10^N
что это делает? Это = int(v)

А чтобы оставить N цифр, я думаю проще перевести в string , отделить нужное количество символов и обратно. Или те надо мат функцию?

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

Сообщение tyomitch » 20.07.2006 (Чт) 20:11

XPAHuTEJIb писал(а):
2) Int(v*10^N)/10^N
что это делает? Это = int(v)

Раньше чем постить, рекоммендуется думать :evil:
Изображение

XPAHuTEJIb
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 12.07.2006 (Ср) 15:04
Откуда: Новый Уренгой

Сообщение XPAHuTEJIb » 20.07.2006 (Чт) 20:23

:) Не нравится мне эта киска, она читает мои мысли...(с) Ледниковый период

тот же код

Сорри tyomitch, скобку не там закрыл :)

Код: Выделить всё
Int(v)*10^N/10^N

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

Сообщение Nicky » 21.07.2006 (Пт) 6:50

2~Ilya~: 1.56-> 1.6 - это вниз?!

2XPAHuTEJIb: Упорно тупишь?

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 21.07.2006 (Пт) 7:56

Э...

Код: Выделить всё
Fix(1.56)


Скучна...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

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

Сообщение tyomitch » 21.07.2006 (Пт) 7:57

Andrey, надо до N цифр.
Изображение

XPAHuTEJIb
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 12.07.2006 (Ср) 15:04
Откуда: Новый Уренгой

Сообщение XPAHuTEJIb » 21.07.2006 (Пт) 8:19

Nicky Сам тупик, всё упорно флудишь...ты тут каким боком влез? Ни одного предложения....чистый флуд
Я перед человеком извинился...кроме того выложил свой вариант кода, в отличие от тупиков...

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

Сообщение Nicky » 21.07.2006 (Пт) 9:01


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

Сообщение ~Ilya~ » 24.07.2006 (Пн) 12:26

Спасибо! В принципе до этих вариантов я додумался сам.
А есть ли встроенное форматирование для функции Format, которое именно обрезает лишние цифры ?
при форматировании "#.###" или "0.000" все рано происходит округление.
А все таки есть ли такое форматирование в Excel?

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 25.07.2006 (Вт) 9:03

На сколько я знаю ф-я Round новая, будет ли она работать в vbs в Win98?
~Ilya~, посмотри здесь(справоник функций):
http://visualbasic.noka.ru/index.php?Pa ... load&id=22
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

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

Сообщение tyomitch » 25.07.2006 (Вт) 9:17

Функция Round появилась в VBS 2.0: т.е. в IE4 она уже была, а в Win98 -- и подавно.
Изображение

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

Сообщение ~Ilya~ » 25.07.2006 (Вт) 15:17

ну ладно, я понял. Такого встроенного форматирования нет - но хотелось бы!!! :roll: Кидаю данные в excel-таблицу - часть нужно округлить - а у части просто взять N цифр после запятой.
Округление я могу выставить в форматировании ячейки, а вот другое - ни фига. Только в VB. Получается разнобой, путанница, и. т.д.

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 25.07.2006 (Вт) 15:43

=ОКРВНИЗ(число,точность) :?: :roll:
Быть... или не быть. Вот. В чём вопрос?

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

Сообщение ~Ilya~ » 26.07.2006 (Ср) 16:51

Хм... спасибо. Видимо придется делать это через формулу, такого встроенного форматирования у ячейки нет. Ну что ж, тоже не плохо.
Это лучше чем округлять цифири внутри VB, ведь при желании можно посмотреть и не округленные значения.
посмотрел - там этих функций ОКРугления дофига, на любой вкус 8)

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

Сообщение Gmp » 26.07.2006 (Ср) 22:13

если только так:

Dim i As String
i = "235,56321369347"
i = Mid$(i, 1, InStr(i, ",") + 3)

Дает 3 знака после запятой (235,563)

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

Сообщение GSerg » 26.07.2006 (Ср) 22:28

Gmp, что будешь делать на системах, где десятичный разделитель - точка или что-то ещё?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение Gmp » 26.07.2006 (Ср) 22:31

GSerg
Dim i As String
i = "235.56321369347"
If InStr(i, ",") > 0 Then
i = Mid$(i, 1, InStr(i, ",") + 3)
Else
i = Mid$(i, 1, InStr(i, ".") + 3)
End If

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

Сообщение GSerg » 26.07.2006 (Ср) 22:52

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

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

Сообщение Gmp » 26.07.2006 (Ср) 22:54

GSerg
а такое бывает и где?
Elseif?

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

Сообщение GSerg » 26.07.2006 (Ср) 23:02

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

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

Сообщение Gmp » 26.07.2006 (Ср) 23:05

GSerg
А я еще раз спрашиваю где такое применяется и зачем? :?

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

Сообщение GSerg » 26.07.2006 (Ср) 23:07

Ты не допускаешь существование национальных настроек, отличных от твоих? А они есть.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение Gmp » 26.07.2006 (Ср) 23:10

GSerg
Но числа ведь всегда будут либо с ",", либо с "." :) - если нет покажи в какой из национальных настроек это не так. ;)

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

Сообщение GSerg » 26.07.2006 (Ср) 23:18

А, т.е. обязательно прыгать с крыши, чтоб убедиться, что так делать не надо? Я пас.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

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

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

Function DCC(ByVal Number As Double) As Long
num$=Cstr(Number)
Do
  i% = i% + 1
Loop Until Not(IsNumeric(Mid$(num$, i%, 1)))
DCC = CLng(Left$(num$, i%-1))
end Function


Раскритикуете?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Сообщение Gmp » 27.07.2006 (Чт) 10:27

GSerg
А ответить по существу на поставленный вопрос? ;)

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

что скажешь?

Хакер
Сейчас тебе GSerg скажет что оперировать со строками как с числами само по себе некрасиво - это я про Cstr. :D
Последний раз редактировалось Gmp 29.07.2006 (Сб) 16:23, всего редактировалось 3 раз(а).

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

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

Пусть он лучше объяснит некрасивость, а то говорить все мастера.

И пусть не говорит что Mid$ на 0,0004 сек. быстрее Mid
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Сообщение GSerg » 27.07.2006 (Чт) 10:48

Gmp писал(а):Сейчас тебе GSerg скажет что

Неа. После этого:
Gmp писал(а):Dim i As Double
i = "22,343677"
GSerg ничё говорить не будет, и тихо откланивается.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

След.

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

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

Сейчас этот форум просматривают: Mail.ru [бот] и гости: 13

    TopList