C # 2.0 двойная обработка - причудливое поведение - PullRequest
1 голос
/ 27 июля 2010
Double dblValue = 0.0001;
Boolean a = (dblValue >= (1 / 1000));
Boolean b = (dblValue >= 0.001);
Console.WriteLine("dblValue >= (1 / 1000) is " + a);
Console.WriteLine("dblValue >= 0.001 is " + b);
Console.ReadLine();

Приведенный выше код C # оценивает 'a' в true и 'b' в false.В VB.NET эквивалентный код оценивает 'a' в false и 'b' в false.Почему 'a' оценивается как true?

Есть ли здесь неявное преобразование, которое мне не хватает - и почему оно не влияет на VB.NET (Strict)?

Ответы [ 3 ]

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

Выражение 1 / 1000 вычисляется (во время компиляции в этом случае, хотя на самом деле это не имеет значения) с использованием целочисленной арифметики в C #, поэтому оценивается как 0. Используйте 1.0 / 1000 1 вместо того, чтобы принудительно double арифметика для использования.

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


1 Или, согласно комментариям, используйте 1d или (double) 1 или что-либо еще, что заставит один из операндов считаться типом double.

5 голосов
/ 27 июля 2010

1 и 1000 оба являются целыми числами, поэтому результатом будет целое число (в данном случае 0). Вы должны принудительно использовать двойники, чтобы завершить математику.

Boolean b = (dblValue >= ((double) 1/(double) 1000));

или

Boolean b = (dblValue >= (1d / 1000d));

даст вам ожидаемый результат.

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

Поскольку 1/1000 является целочисленным выражением, получая 0

...