Member 12561559 Ответов: 2

Десятичный синтаксический анализ - почему он работает так, как он работает.


Это продолжение другого вопроса, похожего, но не того же самого
why-I-need-to-parse-if-object-value-is-decimal


Принимая a vb.net приложение, неявное преобразование, установленное на ошибку в компиляторе.

Так что - например
Дим MyDecimal как десятичное=десятичное.синтаксический анализ(0.001.метод toString)

MyDecimal=MyDecimal*0.45355

Ошибка: неявное преобразование из двойного в десятичное.


Хорошо. Так что тогда я должен сделать что-то странное, например:

MyDecimal=MyDecimal*десятичный.синтаксический анализ(0.45355.метод toString)

Почему это должно быть сделано именно так - или есть лучший способ справиться с этим? Похоже, что это пустая трата цикла процессора, чтобы преобразовать его в строку, а затем разобрать его как десятичное число. Почему система просто понять (мне), что 0.45355 является десятичной, потому что это и (II) почему не просто десятичное.синтаксический анализ(0.45355) в любом случае работать, если он не поймет, что 0.45355-десятичное.
Даже если число имеет меньше десятичных знаков, то есть 0,4, оно все равно стонет, что его удвоение.

Я просто пытаюсь понять логику, лежащую в основе того, почему компилятор так думает? Спасибо!

Что я уже пробовал:

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

0x01AA

Как насчет этого:
Dim dec As Decimal
dec = 2.375D

Member 12561559

Спасибо!

2 Ответов

Рейтинг:
19

OriginalGriff

Потому что вы не указываете его, постоянный литерал 0.45355 это неявный двойной значение, а не десятичное - и поскольку они имеют приоритет над десятичным при вычислении (чтобы не потерять точность), результат Decimal * Double является двойным.

Добавьте букву "D" в конец вашего литерального значения, и система будет знать, что это десятичное значение, и действовать соответственно:

MyDecimal = MyDecimal * 0.45355D


Member 12561559

Ладно, если честно, это имеет смысл. Итак, опять же, поскольку я пытаюсь реализовать синтаксический анализ для большинства вещей, как convert.to устарел от предыдущего вопроса, который я поставил, что кто - то упомянул-у меня есть дата:

Dim CleanDaysToGo as int32=0
CleanDaysToGo = NextCleanDate.Ценность.Вычтите(Сейчас).TotalDays
не работает из-за проблем с datetime, поэтому используйте parse.datetime и parse.int32, чтобы превратить результат в int32 на внешней стороне, например:


Dim CleanDaysToGo as int32=0
CleanDaysToGo = Int32 Значение.Разбора(Типа Datetime.Синтаксический Анализ(NextCleanDate.Ценность.Метод toString).Вычтите(Сейчас).Всего дней.Метод toString)

NextCleanDate - это nullable datetime, равный, скажем, 25 февраля 2020 года - то есть через 6 дней - и CleanDaysToGo должен удерживать это значение-но он проваливается с ошибкой, только во время выполнения с "входной строкой не в правильном формате".

Извините, что кажусь таким тупым с этим и последующим вопросом, с вопросом, но это может быть полезно для других, кто сталкивается с теми же проблемами. :) Овации

Richard MacCutchan

Вам необходимо ознакомиться с документацией по типам и классам. Вы, по-видимому, находитесь в заблуждении, что компилятор может угадать ваши намерения.

Рейтинг:
1

CPallini

То Decimal конструктор имеет перегрузку для Double. Видеть Десятичный Конструктор (Система) | Microsoft Docs[^].


Member 12561559

Спасибо! извините, что я не мог дать вам решение accept, просто Грифф вошел туда первым - в противном случае, 5 звезд от меня :)

CPallini

Добро пожаловать.