Excel 使用四舍五入值作为VLOOKUP的输入,导致N/A返回

Excel 使用四舍五入值作为VLOOKUP的输入,导致N/A返回,excel,vlookup,Excel,Vlookup,我在excel中有以下值(A1等为单元格引用): 然后在VLOOKUP调用中使用A2和A3的值: B2 = IF(A2>0.3,"Out of Range",VLOOKUP(A2,data!$A$42:$B$71,2,FALSE)) B3 = IF(A3>0.3,"Out of Range",VLOOKUP(A3,data!$A$42:$B$71,2,FALSE)) B2正确填充。B3返回#N/A 我正在查看的范围包含以下数据: 所需的所有数据都可用,但工作表似乎无法获得0.07

我在excel中有以下值(A1等为单元格引用):

然后在VLOOKUP调用中使用A2和A3的值:

B2 = IF(A2>0.3,"Out of Range",VLOOKUP(A2,data!$A$42:$B$71,2,FALSE))
B3 = IF(A3>0.3,"Out of Range",VLOOKUP(A3,data!$A$42:$B$71,2,FALSE))
B2正确填充。B3返回
#N/A

我正在查看的范围包含以下数据:

所需的所有数据都可用,但工作表似乎无法获得0.07的值。有人知道为什么吗?它似乎适用于我迄今为止尝试过的所有其他价值观

关键信息 如果我擦除
A3=ROUNDUP(A1,2)
,只需在单元格
A3
中键入
0.07
,它就可以正常工作。所以我很好奇ROUNDUP在做什么,因为它似乎会导致VLOOKUP摔倒


我曾尝试将舍入函数嵌套到我的VLOOKUP方程中,但得到了相同的结果

多亏了评论中的@Axel Richter和@SJR,这个bug似乎与Excel在四舍五入后存储值的方式有关。有关天花板功能的类似示例,请参见

似乎有一些变通办法:

1)使用INT()

=INT(100*ROUNDUP(A1,2))/100
而不是简单地使用综述解决了这个问题

2)强制Excel以显示的精度工作

File > Options > Advanced > Set Precision As Displayed
但是,这可能会导致数据丢失,而且并非最佳解决方案

3)对你的综述进行汇总

ROUND(ROUNDUP(A1, 2), 2)
感谢@Kanak的帮助

其他评论

在我的例子中,使用
=天花板(A1,0.01)
是可行的,但在前面提到的问题中,天花板实际上也是一个问题-因此这不应该被视为一个解决方案

将@Axel Richter的from before应用于我的问题表明,使用
ROUNDUP
可以在单元格中显示的内容与Excel实际存储的值之间产生微小差异。就我而言,舍入误差如下:

 Sub testRoundup()

 Dim v As Double, test As Boolean, diff As Double

 v = [ROUNDUP(0.0625,2)]            '0.07
 test = (v = 0.07)                  'FALSE
 diff = 0.07 - v                    '1.38777878078145E-17

End Sub

另一个

作为对给定答案的补充:

浮点运算的IEEE规范不是这个问题的罪魁祸首。相反,它显然是
天花
ROUNDUP
实现中的一个缺陷。在使用浮点数时,四舍五入应该是解决方案,而不是问题

由于
*.xlsx
文件是简单的ZIP归档文件,我们可以简单地解压缩它并查看真正存储的内容。例如在
/xl/worksheets/sheet1.xml
中,我们发现:

<sheetData>
 <row r="1" spans="1:2">
  <c r="A1">
   <f>ROUNDUP(0.0625,2)</f>
   <v>6.9999999999999993E-2</v>
  </c>
  <c r="B1">
   <f>ROUND(ROUNDUP(0.0625,2),2)</f>
   <v>7.0000000000000007E-2</v>
  </c>
 </row>
 <row r="2" spans="1:2">
  <c r="A2">
   <f>CEILING(0.0625,0.01)</f>
   <v>7.0000000000000007E-2</v>
  </c><c r="B2">
   <f>ROUND(CEILING(0.0625,0.01),2)</f>
   <v>7.0000000000000007E-2</v>
  </c>
 </row>
 <row r="3" spans="1:2">
  <c r="A3">
   <f>ROUNDUP(15.25,1)</f>
   <v>15.299999999999999</v>
  </c>
  <c r="B3">
   <f>ROUND(ROUNDUP(15.25,1),1)</f>
   <v>15.3</v>
  </c>
 </row>
 <row r="4" spans="1:2">
  <c r="A4">
   <f>CEILING(15.1,0.1)</f>
   <v>15.100000000000001</v>
  </c>
  <c r="B4">
   <f>ROUND(CEILING(15.1,0.1),1)</f>
   <v>15.1</v>
  </c>
 </row>
</sheetData>

综述(0.0625,2)
6.999999999393E-2
四舍五入(汇总(0.0625,2),2)
7.0000000000000007E-2
天花板(0.0625,0.01)
7.0000000000000007E-2
圆形(天花板(0.0625,0.01),2)
7.0000000000000007E-2
综述(15.25,1)
15.299999999999999
四舍五入(综述(15.25,1),1)
15.3
天花板(15.1,0.1)
15.100000000000001
圆形(天花板(15.1,0.1,1)
15.1

正如我们在这里看到的,声称“仅存储15位精度有效数字”的说法并不真实。相反,IEEE 754
double
精度中的实数最多可存储17位精度。此外,
ROUNDUP
天花
有时不存储舍入值。正如我所说,在我看来这是一个错误<代码>四舍五入和
四舍五入
总是按其应该的方式存储四舍五入值。

如问题所述,如果我键入0.07作为硬值,则VLOOKUP有效。这似乎与综述有直接关系。一位同事问我这个问题,我给了他们一个线性插值的例程,解决了这个问题,但是我仍然很好奇为什么会出现这种情况。我自己做了一个测试,也遇到了同样的问题。我发现这解决了
=INT(100*ROUNDUP(A1,2))/100
的问题,这可能表明它与小数的浮点存储有关。但为什么草甘膦能起作用还是个谜!我可能错了,但Excel的低级别实际上可能处理二进制数。而
0.07
0.000100011101011100001100010100011111101011100001100010100011101011100001…
,它意味着截断,以便有限地写入。Excel显示的是
0.07
,但它实际上可能在“头脑”中有类似
0.07000001
的内容。因此,你得到了错误<代码>舍入(ROUNDUP(A1,2),2)也能完成这项工作。阅读本文,但正如我所说,我不明白为什么舍入有效。另请参阅
<sheetData>
 <row r="1" spans="1:2">
  <c r="A1">
   <f>ROUNDUP(0.0625,2)</f>
   <v>6.9999999999999993E-2</v>
  </c>
  <c r="B1">
   <f>ROUND(ROUNDUP(0.0625,2),2)</f>
   <v>7.0000000000000007E-2</v>
  </c>
 </row>
 <row r="2" spans="1:2">
  <c r="A2">
   <f>CEILING(0.0625,0.01)</f>
   <v>7.0000000000000007E-2</v>
  </c><c r="B2">
   <f>ROUND(CEILING(0.0625,0.01),2)</f>
   <v>7.0000000000000007E-2</v>
  </c>
 </row>
 <row r="3" spans="1:2">
  <c r="A3">
   <f>ROUNDUP(15.25,1)</f>
   <v>15.299999999999999</v>
  </c>
  <c r="B3">
   <f>ROUND(ROUNDUP(15.25,1),1)</f>
   <v>15.3</v>
  </c>
 </row>
 <row r="4" spans="1:2">
  <c r="A4">
   <f>CEILING(15.1,0.1)</f>
   <v>15.100000000000001</v>
  </c>
  <c r="B4">
   <f>ROUND(CEILING(15.1,0.1),1)</f>
   <v>15.1</v>
  </c>
 </row>
</sheetData>