C 使用单独的美元和美分数组打印美元金额

C 使用单独的美元和美分数组打印美元金额,c,arrays,C,Arrays,我试图获取用户输入,将其存储在数字的数组中,然后获取数字的美元和美分部分,将其存储在单独的数组中,然后打印格式化的数字 这是我的代码: #include <stdio.h> int main() { int i; float amounts[5]; printf("Enter numbers as dollar amounts: \n"); for(i=0; i<5; i++) { printf("Value %d: ", i+1); s

我试图获取用户输入,将其存储在数字的数组中,然后获取数字的美元和美分部分,将其存储在单独的数组中,然后打印格式化的数字

这是我的代码:

#include <stdio.h>

int main() 
{
    int i;
    float amounts[5];

printf("Enter numbers as dollar amounts: \n");

for(i=0; i<5; i++) {
    printf("Value %d: ", i+1);
    scanf("%f", &amounts[i]);
}

long dollars[5];
long cents[5];

for (i=0; i<5; i++) {
    dollars[i]=(int)amounts[i];
    cents[i]=(amounts[i]-dollars[i]);
    cents[i]*=100;
}

for (i=0; i<5; i++) {
    printf("\n$%ld.", dollars[i]);
    printf("%ld", cents[i]);
}

return 0;
}
#包括
int main()
{
int i;
浮动金额[5];
printf(“输入数字作为美元金额:\n”);

对于(i=0;i你失去了这里的分数部分:

cents[i]=(amounts[i]-dollars[i]);
cents[i]*=100;
两者之间的差值小于1,因此将该值赋给
int
会导致该值被截断为0

在赋值之前,需要将差值相乘,以避免截断:

cents[i]=100*(amounts[i]-dollars[i]);

你失去了这里的分数部分:

cents[i]=(amounts[i]-dollars[i]);
cents[i]*=100;
两者之间的差值小于1,因此将该值赋给
int
会导致该值被截断为0

在赋值之前,需要将差值相乘,以避免截断:

cents[i]=100*(amounts[i]-dollars[i]);
(i=0;i)的


for(i=0;iOP的方法有问题

printf("\n$%ld.", dollars[i]);
printf("%ld", cents[i]);
  • 负数
    amount[i]==-1.23
    看起来像
    “$-1-23”

  • amount[i]==9.998这样的值打印为
    “$9.99”
    ,可能应该是
    “$10.00”

  • 缺少前导零
    金额[i]==1.03
    打印为
    “$1.3”

  • amounts[i]
    超出
    int
    范围时,
    amounts[i]=(int)amounts[i]
    失败

  • OP的关键问题

    // problem
    dollars[i]=(int)amounts[i];
    cents[i]=(amounts[i]-dollars[i]); // cents[i] is an integer, cannot hold a fraction
    cents[i]*=100;
    
    // Alternative
    
    // round
    amount[i] = round(amount[i] * 100)/100.0;
    
    // take apart;
    float ipart;
    cents[i] = (int) roundf(modff(amounts[i], &ipart)*100.0f);
    dollars[i] = (int) ipart;
    
  • 如果代码要使用FP赚钱,建议:

  • 使用
    double

  • 在任何不精确的计算之后,四舍五入到最近的货币单位。在OP的情况下,这是
    1/100

    amount[i] = round(amount[i] * 100)/100.0;
    
  • 使用统一打印

    printf("\n$%0.2f", amount[i]);
    

  • OP的方法有问题

    printf("\n$%ld.", dollars[i]);
    printf("%ld", cents[i]);
    
  • 负数
    amount[i]==-1.23
    看起来像
    “$-1-23”

  • amount[i]==9.998这样的值打印为
    “$9.99”
    ,可能应该是
    “$10.00”

  • 缺少前导零
    金额[i]==1.03
    打印为
    “$1.3”

  • amounts[i]
    超出
    int
    范围时,
    amounts[i]=(int)amounts[i]
    失败

  • OP的关键问题

    // problem
    dollars[i]=(int)amounts[i];
    cents[i]=(amounts[i]-dollars[i]); // cents[i] is an integer, cannot hold a fraction
    cents[i]*=100;
    
    // Alternative
    
    // round
    amount[i] = round(amount[i] * 100)/100.0;
    
    // take apart;
    float ipart;
    cents[i] = (int) roundf(modff(amounts[i], &ipart)*100.0f);
    dollars[i] = (int) ipart;
    
  • 如果代码要使用FP赚钱,建议:

  • 使用
    double

  • 在任何不精确的计算之后,四舍五入到最近的货币单位。在OP的情况下,这是
    1/100

    amount[i] = round(amount[i] * 100)/100.0;
    
  • 使用统一打印

    printf("\n$%0.2f", amount[i]);
    
  • #包括
    #包括
    int main()
    {
    int i,j;
    浮动金额[5];
    printf(“输入数字作为美元金额:\n”);
    对于(i=0;i
    #包括
    #包括
    int main()
    {
    int i,j;
    浮动金额[5];
    printf(“输入数字作为美元金额:\n”);
    
    对于(i=0;i请不要使用浮点数表示货币。将值存储为美分/便士等。由于
    cents[i]=(amounts[i]-dollars[i]);
    尝试将分数存储在
    int
    中,存储的值将始终为零。在同一行中进行乘法:
    cents[i]=100*(amounts[i]-dollars[i])
    。仍然存在问题:1000000.03之类的数字很可能仍然会给你0美分,因为
    float
    类型的范围有限。另外,请注意,你的代码将
    1.09
    格式设置为
    1.9
    -你也必须解决这个问题。你可以将
    long int
    转换为
    float
    然后你再把它写回来,真的吗?请不要用浮点数来表示货币。将值存储为美分/便士等。由于
    美分[i]=(金额[i]-美元[i]);
    尝试将分数存储在
    整数中,存储的值将始终为零。在同一行中进行乘法:
    美分[i]=100*(金额[i]-美元[我])
    。仍然存在问题:1000000.03之类的数字很可能仍然会给你0美分,因为
    float
    类型的范围有限。另外,请注意,你的代码将
    1.09
    格式设置为
    1.9
    -你也必须解决这个问题。你可以将
    long int
    转换为
    float
    然后你再做回来,真的吗?有一个
    丢失了…你发现了吗?肯定应该使用四舍五入到最近的函数来避免截断问题。
    cents[i]=(长)四舍五入(十进制)
    缺少一个
    缺少…你发现了吗?肯定应该使用四舍五入到最近的函数来避免截断问题。
    cents[i]=(长)四舍五入(十进制);