C 有效地将float转换为int

C 有效地将float转换为int,c,C,但我需要打印56997,而不是56996,我是指确切的值,但作为int 如何更改程序,使其有效地将浮点更改为int?在将浮点转换为int之前,向浮点添加0.5 这也是你在数学中要做的。如果你在为需要精度的金钱编写程序,首先不要使用浮点数。将所有内容存储为整数,单位为美分。如果需要浮点数通常是双倍的,而不是浮点数,比如可能需要利率,那么您需要加入与机构规则相匹配的规则,这些规则可能与四舍五入一样简单,也可能与四舍五入不同。避免在浮点数和整数之间更改用于表示货币的类型 货币具有精确性、范围和功能,而

但我需要打印56997,而不是56996,我是指确切的值,但作为int


如何更改程序,使其有效地将浮点更改为int?

在将浮点转换为int之前,向浮点添加0.5


这也是你在数学中要做的。

如果你在为需要精度的金钱编写程序,首先不要使用浮点数。将所有内容存储为整数,单位为美分。如果需要浮点数通常是双倍的,而不是浮点数,比如可能需要利率,那么您需要加入与机构规则相匹配的规则,这些规则可能与四舍五入一样简单,也可能与四舍五入不同。

避免在浮点数和整数之间更改用于表示货币的类型

货币具有精确性、范围和功能,而不仅仅适用于复杂的税收和利率计算等整数。随意的类型转换会加剧这些问题

对于学习,从最小货币单位的int或long开始,并特别注意四舍五入

如果需要浮点类型,则很少选择浮点类型。不要使用整数转换来取整。使用印刷字体或圆形字体

如果绝对需要转换为int,请使用浮点舍入函数进行舍入,然后转换或使用lrint


除去浮点数,以百分比计算由于执行加法时引入的舍入误差,这可能无法工作。例如,如果你从一个恰好没有小数部分的数字开始,加上0.5的结果可能略高于或略低于下一个半整数。加上0.5,然后将其转换为int对许多浮点数有效,但对1许多负数、2浮点数值略低于0.5f会生成错误答案,3许多最小有效位为0.5或1.0的大浮点值。@chux true表示1。。。对其他人来说,问题不在于转换,而是浮点数在最后一位永远都不精确。。。将其转换为int不会使其更好。@MichelKeijzers所有有限浮点都是精确的。这是导致近似值的运算。。。。。使用int some_float+0.5通常不是一个问题,因为0.5是一个双精度`并且出现了双精度数学。int一些_float+0.5f不会,因为你会让它变得更好,但会让事情变得更糟。C有各种舍入函数round、rint、nearbyint、lrint,可以很好地处理这些舍入问题。
float totalPurchaseAmount, totalPurchaseTax,totalShippingCharge, totalShippingTax,    totalGiftWrapCharge, totalGiftWrapTax, totalAmount;  
int totalAmountCents;

totalAmount = totalPurchaseAmount + totalPurchaseTax + totalShippingCharge + totalShippingTax + totalGiftWrapCharge + totalGiftWrapTax ;

/* The %.2f formatting string limits the output to 2 decimal places */

lr_output_message("total %.2f", totalAmount);

lr_output_message("total %.2f",totalAmount );o/p=totalAmount = 569.97

totalAmountCents = totalAmount * 100;

lr_output_message("total cents %f",totalAmountCents);

o/p=totalAmountCents=56996
float totalAmount;  
int totalAmountCents;
...
totalAmountCents = totalAmount * 100;
double totalAmount;  
double totalAmountCents;
...
totalAmountCents = rint(totalAmount * 100);
#include <math.h>
totalAmountCents = rint(totalAmount * 100);
int iCents = (int) totalAmountCents;
// or 
long LCents = lrint(totalAmount * 100);