C / C ++ sprintf格式-0

时间:2016-09-29 21:06:37

标签: c++

曾经有过这个小功能

string format_dollars_for_screen(float d)
{
  char ch[50];
  sprintf(ch,"%1.2f",d);
  return ch;
}

谁愿意返回-0.00

我将其修改为

string format_dollars_for_screen(float d)
{
  char ch[50];
  float value;
  sprintf(ch,"%1.2f",d);
  value = stof(ch);
  if(value==0.0f) sprintf(ch,"0.00");
  return ch;
}

它开始根据需要返回0.00。我的问题是,为什么这个其他解决方案不起作用?

string format_dollars_for_screen(float d)
{
  char ch[50];
  float value;
  sprintf(ch,"%1.2f",d);
  value = stof(ch);
  if(value==0.0f) sprintf(ch,"%1.2f", value);
  return ch;
}

和/或有更有效的方法吗?这只是我的头脑,所以欢迎批评。 =)

1 个答案:

答案 0 :(得分:3)

浮点数有两个加零和零零。它们与==运算符相等,但在其他算术表达式中产生不同的结果:1/+0 == +inf1/-0 == -inf

就您的情况而言,您不应使用浮点数作为货币数量。而是使用整数来计算美分(或美分的其他小数部分),并相应地格式化它们:

string format_dollars_for_screen(int cents)
{
  bool neg = cents < 0;
  if(neg) cents = -cents;
  char ch[50];
  sprintf(ch, "%s%d.%.2d", "-"+!neg, cents/100, cents%100);
  return ch;
}