在float中过滤某些类型的数据

时间:2011-09-29 09:48:14

标签: iphone

如何过滤掉只有十进制以外的零的浮点值&其他人也有超过十进制的非零值。

例如。

13.000000 13.120001

我想要这样:

13.0 13.120001

2 个答案:

答案 0 :(得分:0)

如果您的应用程序将浮点值存储在C / C ++的浮点数或双精度值中,则可能会出现问题。

首先,在大多数情况下,float / double表示使用base-2的值,当你执行类似double x = 0.1;的操作时,x实际上永远不会等于0.1,但它将非常接近0.1。这是因为不是每个小数(基数为10)的分数都可以用base-2精确表示。

当您使用其中一个类似printf的函数打印或将该x转换为字符串时,结果字符串可能会从0.099999999到0.1到0.10000000000000000555之间变化。结果将取决于x中的内容以及如何将其转换为字符串(整数部分,小数部分或全部允许的位数)。

一般来说,这里没有一个通用的解决方案。在一种情况下,正确性和舍入问题可能并不重要,而在另一种情况下,它们可能是最重要的。当性能比小数部分的精确表示更重要时,使用base-2类型。否则,例如,当您计算金钱时,您使用特殊类型(并且您可能首先需要构建它们),它们可以精确地表示小数部分,然后以额外的计算时间为代价避免一些所描述的问题。存储

有时您可能会使用定点类型和算术。例如,如果您的数字不应超过3个小数位且不是太大,则可以使用缩放整数:

long x = 123456; // x represents 123.456

您可以像常规整数一样对它们进行加,减,比较,但是您可以将它们相乘而不同,例如:

long x = 123456; // x represents 123.456
long y = 12345;  // y represents 12.345
long p = (long)(((long long)x * y) / 1000); // p=1524064, representing x*y=1524.064
long q = (long)((long long)x * 1000) / y);  // q=10000, representing x/y=10.000

在这种情况下,计算小数部分的数字相对容易,只需看(x%1000)/ 100,(x%100)/ 10和x%10。

答案 1 :(得分:0)

将13.00000或13.20001分成2个值,如13.0000中的13和0000 ...所以比较第二个值是否大于0(例如:13.20001,其中2001> 0)如果是,则设置相同的值。 else(ex 13.0000,其中0000 = 0)然后设置%。2f => 13.00