Visual Studio расширяется с 1.1 до 1.1000000000000001 - PullRequest
3 голосов
/ 01 марта 2011

Это, по крайней мере для меня, самое странное поведение Visual Studio 2010 за всю историю.Я работаю над проектом MVC3, я скопировал строку кода из другого проекта (также VS2010, MVC1, если это имеет значение), который выглядит следующим образом:

target_height = height * 1.1

, когда я вставляю его в проект MVC3, он получаетрасширен до

target_height = height * 1.1000000000000001

Теперь, если я наберу 1.2, все нормально, ничего не произойдет, но если я наберу 1.12, он будет расширен до 1.1200000000000001.

И target_height, и height - целые числаПочему одна Visual Studio отображает 1.1, а другая расширяет ее до 1.1000000000000001?

Что происходит ???

Ответы [ 3 ]

1 голос
/ 04 марта 2011

Я думаю, что это автозаполнение сошло с ума и начало фиксировать константы с плавающей запятой в «разрешенных» значениях. Как написано в http://accessmvp.com/Strive4Peace/VBA/VBA_L1_02_Crystal.pdf, автозаполнение VB действительно пытается предложить только «вещи, которые относятся конкретно к этому типу данных». int * double по понятным причинам не усекается до int * int (автоматические преобразования всегда выполняются только при необходимости), и вы видите двойное представление 1.1 или 1.12 (epsilon = 1.11e-16).

Я думаю, что для того, чтобы узнать точные условия, когда это произойдет, потребуется дополнительная проверка или проверка, но, поскольку я не использую VB.NET или MVCx, я не хочу этого делать.

0 голосов
/ 04 февраля 2013

Числовой литерал 1.1 на самом деле не представляет величину 11/10, а вместо этого представляет величину вокруг [(2 ^ 53 * 11) / 10] / (2 ^ 53), которая чуть больше 11 /10.Хотя это значение может быть записано точно в виде десятичного числа с 53 значащими цифрами, это будет примерно так же полезно, как использование измерительной ленты, обозначенной в дюймах, для определения, что что-то длиной 1 3/16 "и запись измерения как 30,1625 ммЕсли не удастся различить измерение, которое было бы длиннее, короче или короче менее чем на 1/64 дюйма, то измерение составило бы 30,1625 мм +/- 0,396875 мм, что функционально равно 30,2 мм +/-0,4 мм.

Любопытно, что Visual Studio выберет для представления числовое значение, ближайшее к 1.1, как 1.1000000000000001.С одной стороны, литерал 1.1 будет более кратким представлением того же значения.С другой стороны, даже если вышеупомянутый литерал будет неотличим от 1.1, более подробное представление не лишено преимущества.В некоторых случаях может быть полезно узнать, немного ли больше или немного меньше того, чем оно «кажется».Хотя разница между числовым литералом 1.1 и математическим значением 11/10 численно незначительна (умножение числового литерала на десять дает ровно 11), разница между (1.1-1.0) и (1/10) заметна (умножениечисловое выражение на 10 дает значение больше единицы).

0 голосов
/ 01 марта 2011

1.1 и 1.12 не должны иметь точного двоичного представления.

см. Это: https://stackoverflow.com/questions/634206/what-every-programmer-should-know-about

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