我希望您了解整数和实数或浮点数/双精度数之间的区别。
我想在 Excel 电子表格中仅选择除复数以外的非整数,即实数(计算机科学中的双精度/浮点数)。我该怎么做?
答案1
正如 Akina 在评论中指出的那样,我们确实都了解它们之间的区别。
但真正的问题是,你并没有真正理解一些事情,关于 Excel,实际上有几件事是完全正确的:
对于单元格内的值,Excel 中没有整数类型。所有数字,在所有时间、所有情况和所有条件下,都是 IEEE 双精度类型值。甚至没有一个“陷阱”情况会让您用它赢取赌注。在上帝的绿色地球上的每种情况下,它们都是这样。
例如,请记住,当 Excel 将数字字符显示为纯整数时,它只是:显示。当它显示并(“大部分”)将它们视为文本时,它只是:显示并视为文本。实际上,它们仍然作为完整的双精度值存储在 Excel 内部并可供使用。
更糟糕的是,Excel 在其大量内部数学运算中使用位运算,并生成所有可能导致的近似值。因此,取一个值,例如 12,然后开始从中减去 0.1。或者更具体地说,将 0.1 放入单元格中,然后从中加或减该单元格值,然后将明确输入的值减去/加(取相反的运算)回该单元格。在某个时候,您会看到该值变成,哦,比如说,12.00000000000001。太棒了,Excel。因此,即使某些东西以某种方式“纯化”为类似整数,它仍然是双精度的,并且最终会出错,只要对其进行正确的随机组合。
因为它从来都不是、也永远不可能是一个整数。
所以你的愿望很容易满足:你在 Excel 中遇到的每个数字都是非整数。
但是,您可以测试每个值是否四舍五入为整数,精度可达到您选择的某个值。有多种方法可以准确测试这一点,即使您是 Excel 的新手,您也可能怀疑其中一种方法,这听起来像是您的编程经验:Excel 有一个INT()
函数。但是,它对负值的行为与您预期的不同,因此使用您可能期望找到的另一个函数TRUNC()
(“截断”)是执行此操作的更好方法。MOD()
也很受欢迎。只需使用TRUNC()
截断小数点后 0 位的测试值,然后减去截断到小数点后 8-10 位左右的相同值的截断版本,以捕获任何显着(“实际”)小数部分,并查看结果是否为 0。如果是,则将其定义为整数并以您喜欢的任何方式忽略它。不符合您的条件的内容可以被选中。
它实际上并不是你想要的,但它模拟了它:“我不是一个真正的整数,但我在电视上扮演一个整数。你可能在...见过我”
要收集它们,您可以将所述公式放在一列中,使用“”(接近空值:空白)的结果来表示任何符合上述整数测试的内容,如果未通过测试,则使用值本身的结果。将结果作为值(而不是公式)复制到另一列中,然后对该列进行排序。空白将排序到最后,在非整数列中留下一个连续的列表,然后您可以随意使用它。有更巧妙的方法可以做到这一点,但这是一种简单的方法,听起来你几乎没有 Excel 经验,所以越简单越好,是吗?
如果我错了,而您又能理解,那么您可能知道如何编写 VBA 宏来测试和创建上述值的数组,然后您可以随意处理这些值。如果您愿意花时间和精力,那么 Excel 可以做的所有事情都可以用 VBA 完成,而且几乎总是做得更好。因此,如果您掌握了 VBA,那就是黄金标准。
但是,由于实际上不可能存在必须让 Excel 在单元格中创建整数值的情况,而是你认为它无论如何都必须这样做,那么为什么不呢,这样你就可以迅速地将这一事实用于你的筛选,你会很高兴地知道,不,Excel 不会做任何方便的事情。因此,你必须处理一些令你满意其准确性的测试,然后使用结果。
不过说真的,Excel 中的数值不是双精度数据类型,这种“陷阱”式的、棘手的、鲜为人知的独特情况根本不存在。它们永远、永远、永远不是整数。永远。
现在,综上所述,我想指出 VBA 可以创建和使用整数类型变量等。不过,再次强调,弄清楚哪些值是这样的,可以让您知道您的选择是否需要一个数字,那么为什么要一路走下去,而不是只要走得足够远就能实现您的目标呢?
最后,您可以使用其他程序做很多事情,因为当今大多数程序都可以读取 Excel 文件,其余程序可以读取您在 Excel 中创建的 CSV。将记录加载到数据库(如 Excel 的同类程序 Access)中并在其中编写测试代码,然后将通过测试的记录转换为实际的整数数据类型并在那里进行选择,尽管这和其他所有事情一样,总是回到这样的想法:到那时,您知道哪些程序通过了选择测试,那么为什么其他程序还要费心呢?
但不要费心在 Excel 中寻找现成的整数。它们根本不存在于 Excel 电子表格的单元格中。