2011-03-01 50 views
3

至少在我看来,这是绝大多数bizzare Visual Studio 2010的行为。我工作的MVC3项目,我复制的代码行从另一个项目(VS2010也MVC1如果它事项),看起来像这样:Visual Studio将1.1扩展到1.1000000000000001

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?

这是怎么回事?

+0

看这里http://www.wiffin.com/他们也有«更多»链接了解更多关于主题的信息(是的,在列表中没有C语言,但想法相同) – 2011-03-01 10:40:26

+0

你是说CLIPBOARD不保存文本,但一些其他数据和数据在PASTE上解释? – 2011-03-01 10:58:43

+1

不,Visual Studio在粘贴和打字时解释/替换它。 – Vnuk 2011-03-01 11:00:18

回答

1

我认为它是自动完成疯了,开始固定浮点常数为“允许”的值。如在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,因此我不愿意这么做。

-2

1.1和1.12一定不能有确切的二进制表示。

看到这一点:https://stackoverflow.com/questions/634206/what-every-programmer-should-know-about

+0

当然 - 问题是为什么VB.NET将数字解析为浮点数,然后在复制并粘贴代码时重新发射它,而不是仅复制复制和粘贴的字符。 – Rup 2011-03-01 17:05:44

+1

它不是粘贴本身,它是自动完成(或一些自动更正),它粘贴或打字后的行为 - 另请参阅“...如果我输入1.12它扩大了...” – Suma 2011-03-01 19:23:16

0

数字文字1​​.1实际上并不代表数量11/10,而是表示数量round [(2^53 * 11)/ 10] /(2^53),这比数字略大于11/10。虽然这个数值可以精确地写成十进制数字,有53个有效数字,但这样做与使用英寸计量的卷尺确定长度为1 3/16英寸并记录测量结果为30.1625mm 。如果无法区分长度小于或短于或短于1/64英寸的测量值,则测量值为30.1625mm +/- 0.396875mm,其功能与30.2mm +/- 0.4毫米。

事实上,Visual Studio会选择将最接近1.1的数字数量表示为1.1000000000000001,这很奇怪。一方面,字面1.1将是相同值的更简洁的表示。另一方面,即使上述文字与1.1不可区分,更详细的表述并非没有优势。在某些情况下,了解数量是否比“看起来”要稍大或稍小一些可能会有所帮助。尽管数字文字1​​.1与数学数值11/10之间的差异在数值上不重要(将数字文字乘以十得出的精确值为11),但是(1.1-1.0)和(1/10)之间的差异是显而易见的(将数值表达式乘以10会产生一个大于1的值)。

+0

真的什么都不明白 – 2017-03-10 12:22:20

+1

@VijaySB :计算机存储数字的方式不能精确表示大多数小数;存储1.1的尝试将代替存储计算机可以表示的最接近的数字,该数字稍微大一些,并且实际上比1.1000000000000000更接近1.1000000000000001。其效果有点像代表像1/3的小数部分0.3小数。如果有人试图在27日中将其作为一个分数来表示,那将是8/27(尽管原来是9/27)。 – supercat 2017-03-10 14:09:23