Как мне обрезать нулевое значение после десятичной - PullRequest
0 голосов
/ 14 июля 2010

Привет, ребята, это смешно ..

Когда я попытался отладить, я обнаружил, что: как только я набираю

Dim value As Double значение = 0,90000, а затем нажмите Enter

автоматически преобразует 0,9

не следует ли сохранить точность в два раза в визуальной базовой ?

для моих расчетов мне абсолютно необходимо показать точность :(

спасибо!

Ответы [ 5 ]

2 голосов
/ 14 июля 2010

Вы получаете то, что видите на экране, с тем, какие биты устанавливаются в Double, чтобы сделать это число.

VB просто «полезен» и просто сбивает лишние нули.Но для всех намерений и целей

0.9

идентичен

0.90000

Если вы мне не верите, попробуйте сделать это сравнение:

Debug.Print CDbl("0.9") = CDbl("0.90000")

Как уже было сказано, отображаемую точность можно отобразить с помощью функции Format $ (), например

Debug.Print Format$(0.9, "0.00000")
2 голосов
/ 14 июля 2010

Если требуется точность, то вы хотите использовать тип данных Currency.

2 голосов
/ 14 июля 2010

В игре есть как минимум два представления вашей ценности.Одним из них является значение, которое вы видите на экране - строка - и одним является внутреннее представление - двоичное значение.Имея дело с дробными значениями, они часто не эквивалентны, а если нет, то это потому, что они не могут быть такими.независимо от того, как они могут появиться при печати.Если вы переходите через строковый домен, скажем, путем сохранения в файл или БД и последующего извлечения, часто приходится оставлять часть этой точности позади.Это неизбежно, потому что интерфейс между двумя доменами не идеален.Некоторые значения, которые могут быть точно представлены в виде строк (или десятичных чисел, то есть степеней десяти), не могут быть точно представлены в виде дробных степеней 2.

Это не имеет ничего общего с VB, это природаплавающая запятая.Лучшее, что вы можете сделать, это контролировать, где происходит округление.Для этого ваш друг - это функция Формат, которая управляет отображением значения в виде строки.

?Формат $ (0,9, «0,00000») покажет вам пример.

1 голос
/ 14 июля 2010

Нет, точность не должна сохраняться.Двоичные значения с плавающей запятой не сохраняют эту информацию ... и было бы несколько странно делать это, учитывая, что вы выражаете значение в одной базе, даже если оно представлено в другой.

НадеюсьНе знаю, имеет ли VB6 десятичный тип с плавающей запятой, но это, вероятно, то, что вы хотите - или, возможно, десятичный тип с фиксированной запятой.Конечно, в .NET System.Decimal сохранил дополнительные 0 с .NET 1.1 и далее.Если это вам не поможет, вы можете подумать о запоминании двух целых чисел - например, «90000» и «100000» в этом случае, так что значение, которое вы представляете, представляет собой одно целое число, деленное на другое, с соответствующим уровнем точности.

РЕДАКТИРОВАТЬ: Я думал, что Currency может быть то, что вы хотите, но в соответствии с этой статьей , это зафиксировано в 4 десятичных разрядах, и вы пытаетесь сохранить 5. Вы могли быпотенциально просто умножьте на 10, если вы всегда хотите 5 десятичных разрядов - но это неуклюжая вещь, которую нужно не забывать делать везде ... и вам нужно будет решить, как правильно отформатировать ее.Подозреваю, что всегда будет 4 десятичных знака, даже если бы вы указали меньше - так что если вы хотите, чтобы «0.300» отличался от «0.3000», тогда Currency может быть неуместным.Я полностью основываюсь на статьях онлайн, хотя ...

0 голосов
/ 16 июля 2010

Вы также можете ввести значение как 0,9 # .Это помогает избежать неявного принуждения в выражении, которое может снизить точность, которую вы ожидаете.В большинстве случаев компилятору не потребуется эта подсказка, потому что литералы с плавающей запятой по умолчанию имеют значение Double (действительно, среда IDE обычно удаляет символ #, если значение не является целым числом, например, 9 # ).

Сравните результаты этих:

MsgBox TypeName(0.9)
MsgBox TypeName(0.9!)
MsgBox TypeName(0.9@)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...