C/C++ sprintf formatting -0

C/C++ sprintf formatting -0

本文关键字:formatting sprintf C++      更新时间:2023-10-16

曾经有一个小函数

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;
}

和/或有更有效的方法来做到这一点?这只是我的想法,所以欢迎批评。div =)

浮点数都有+ 0和- 0。它们与==运算符比较相等,但在其他算术表达式中产生不同的结果: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;
}