0

我的应用程序是这样计算的。

float containTaxValue = 840;
float taxRate = 5;
float divisionedNum = (100 + taxRate)/100;
float removedTaxValue = containTaxValue/divisionedNum;
float taxValue = containTaxValue - removedTaxValue;

最后答案是

NSLog(@"%f",removedTaxValue); => 800.000061
NSLog(@"%f",containTaxValue); => 840.000000
NSLog(@"%f",taxValue); => 39.999939

我想在这段代码中得到“taxValue == 40.000000”。

我无法理解有什么问题。请让我知道任何建议。

4

4 回答 4

2

IEEE 754 标准是一种以机器易于操作的方式存储浮点数的方法。该方法由处理器的 INtel 和 mot 使用。

IEEE 754 规定数字以二进制格式存储,以减少存储需求,并允许所有微处理器上可用的内置二进制算术指令以相对快速的方式处理数据。然而,一些简单的、不重复的十进制数会被转换成重复的二进制数,不能完全准确地存储。

1/10 可以用十进制形式表示 .1

但在二进制形式中,它变成:.0001100011000111000111(等等)

And Hence the rounding-off error occurs.

您必须将其转换int为四舍五入。

1.05 的二进制转换也在 00111111 10000110 01100110 01100110....

于 2013-03-18T08:47:59.920 回答
1

float不能精确地表示许多值,例如 1.05。出现舍入错误并延续到最终结果。

于 2013-03-18T08:35:14.507 回答
0

如果您不确定点后的数字有多长,您可以使用%.6fsimple%f在点后打印精确的 6 位数字,以四舍五入您可以使用ceil(double)函数的值,它会将值四舍五入

只有%f

float taxValue = 39.999999; // you've 6 digits after dot
NSLog(@"%f",ceil(taxValue));

输出,40.000000

%.6f,

float taxValue = 39.99; // you've only 2 digits after dot but still you want to show 6 digit
NSLog(@"%.6f",ceil(taxValue));

输出,40.000000

于 2013-03-18T08:41:59.460 回答
0

要四舍五入浮点值,您可以使用以下代码

float A,B; // this variables have to be floats!
int roundDown = floor(A/B); // rounded down
int roundUp = ceil(A/B); // rounded Up
int rounded = lroundf(theFloat); //rounded

结果 int 值再次转换为 float

希望这可以帮助 !!!

于 2013-03-18T08:52:17.557 回答