C - Float Imprecision,如何锁定计算的小数位?
C - Float Imprecision, How to lock the decimal places for calculations?
我正在编写一个小程序来测试 C 中的浮点数:程序本身很简单,我只是想根据用户的输入,return多少Dollar(s), Quarter(s)... etc
,他的号码有。
//------------------------------> First Part: All the necessary Variables <-----------------------------
int main (void)
{
//Getting the user Input
float number = get_float("Number: ");
//Checking if is a positive number
if (number < 0)
{
printf("A positive number, Please: ");
}
//Declaring my Constant/Temporary variables.
float coinValues[] = {1.00, 0.25, 0.10, 0.5, 0.01};
char *coinNames[] = {"Dollar(s): ", "Quarter(s): ", "Dime(s): ", "Nickel(s): ", "Penny(ies): "};
int i = 0;
int tmp = 0;
//-----------------------------------> Second Part: The code Itself <-----------------------------------
//Checking/Printing the necessary coins.
while (number > 0)
{
//Until the loop stops, check if the number can be divided by the CoinValue.
if (number >= coinValues[i])
{
//Print the current Coin Name from the divided value.
printf("%s", coinNames[i]);
//Check if the Current Number still contains Coin Values inside of it, if True counts one in your "Coin Score".
while (number >= coinValues[i])
{
number -= coinValues[i];
tmp++;
}
//Print the Current "Coin Score", then resets TMP.
printf("%i\n", tmp);
tmp = 0;
}
else
{
//Updating the Coin value
i++;
}
}
}
只要我使用 Integers,我的程序就 运行 很好,但是当我将此代码转换为 Floats 值 (Dime(s), Nickel(s), and Penny(ies))
开始变为 return 非预期的 结果 Int变量tmp.
像 2.6 这样的数字的预期结果将是 2 美元 、2 季度 、和 1 Dime,但有时,程序不使用 Dime(s),而是跳过它们并使用 Nickel(s),然而,困扰我的是程序总是 returning AWL=+ 没有任何价值然后程序永远冻结。
考虑到我唯一的想法是我正在“遭受”Float Imprecision,而且我不知道如何解决它,所以任何人都可以帮助我吗?
Ps. 程序需要始终return 最大值 从每个 coin 传递前。
浮点运算旨在近似实数运算。 IEEE 754-2008 说“浮点运算是对实数运算的系统近似……”因此无法“锁定”二进制浮点数中的十进制数字。它旨在用于您想要 近似值的地方,例如建模物理。这甚至包括一些金融应用程序,例如期权评估。虽然浮点运算在某些情况下可以用于精确计算,但这些需要特别小心,通常只在特殊情况下才进行。
因此,对于您关于如何锁定小数位的问题,答案是没有用二进制浮点数来做到这一点的好方法。尝试这样做通常只会产生与整数运算相同的效果,但效率较低且代码更难。因此,使用整数运算并根据所需的最小货币单位(例如一分钱)缩放金额。
我正在编写一个小程序来测试 C 中的浮点数:程序本身很简单,我只是想根据用户的输入,return多少Dollar(s), Quarter(s)... etc
,他的号码有。
//------------------------------> First Part: All the necessary Variables <-----------------------------
int main (void)
{
//Getting the user Input
float number = get_float("Number: ");
//Checking if is a positive number
if (number < 0)
{
printf("A positive number, Please: ");
}
//Declaring my Constant/Temporary variables.
float coinValues[] = {1.00, 0.25, 0.10, 0.5, 0.01};
char *coinNames[] = {"Dollar(s): ", "Quarter(s): ", "Dime(s): ", "Nickel(s): ", "Penny(ies): "};
int i = 0;
int tmp = 0;
//-----------------------------------> Second Part: The code Itself <-----------------------------------
//Checking/Printing the necessary coins.
while (number > 0)
{
//Until the loop stops, check if the number can be divided by the CoinValue.
if (number >= coinValues[i])
{
//Print the current Coin Name from the divided value.
printf("%s", coinNames[i]);
//Check if the Current Number still contains Coin Values inside of it, if True counts one in your "Coin Score".
while (number >= coinValues[i])
{
number -= coinValues[i];
tmp++;
}
//Print the Current "Coin Score", then resets TMP.
printf("%i\n", tmp);
tmp = 0;
}
else
{
//Updating the Coin value
i++;
}
}
}
只要我使用 Integers,我的程序就 运行 很好,但是当我将此代码转换为 Floats 值 (Dime(s), Nickel(s), and Penny(ies))
开始变为 return 非预期的 结果 Int变量tmp.
像 2.6 这样的数字的预期结果将是 2 美元 、2 季度 、和 1 Dime,但有时,程序不使用 Dime(s),而是跳过它们并使用 Nickel(s),然而,困扰我的是程序总是 returning AWL=+ 没有任何价值然后程序永远冻结。
考虑到我唯一的想法是我正在“遭受”Float Imprecision,而且我不知道如何解决它,所以任何人都可以帮助我吗?
Ps. 程序需要始终return 最大值 从每个 coin 传递前。
浮点运算旨在近似实数运算。 IEEE 754-2008 说“浮点运算是对实数运算的系统近似……”因此无法“锁定”二进制浮点数中的十进制数字。它旨在用于您想要 近似值的地方,例如建模物理。这甚至包括一些金融应用程序,例如期权评估。虽然浮点运算在某些情况下可以用于精确计算,但这些需要特别小心,通常只在特殊情况下才进行。
因此,对于您关于如何锁定小数位的问题,答案是没有用二进制浮点数来做到这一点的好方法。尝试这样做通常只会产生与整数运算相同的效果,但效率较低且代码更难。因此,使用整数运算并根据所需的最小货币单位(例如一分钱)缩放金额。