当前位置: 首页 > 知识库问答 >
问题:

C/C sprintf格式-0

皇甫波峻
2023-03-14

曾经有过这个小功能

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个答案

庞书
2023-03-14

浮点数既有加零又有减零。它们与==运算符相比是相等的,但在其他算术表达式中会产生不同的结果:1/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;
}
 类似资料:
  • 我正在玩我的eclipse格式化程序。 我目前被卡住,无法格式化空的新行。 我知道我可以使用CTRL+SHIFT+F。 但是我希望它在文件保存时自动发生。 下面是另一个例子 此外,我想选择是否应该在ex one结构声明后或在花括号后自动缩进为无空行。

  • 主要内容:C++ cout成员方法格式化输出,使用流操纵算子格式化输出在某些实际场景中,我们经常需要按照一定的格式输出数据,比如输出浮点数时保留 2 位小数,再比如以十六进制的形式输出整数,等等。 对于学过 C 语言的读者应该知道,当使用 printf() 函数输出数据时,可以通过设定一些合理的格式控制符,来达到以指定格式输出数据的目的。例如 %.2f 表示输出浮点数时保留 2 位小数,%#X 表示以十六进制、带 0X 前缀的方式输出整数。 关于 printf()

  • 如何在C中格式化一个浮点数以输出到四舍五入的两位小数?我在< code>setw和< code>setprecision上运气不好,因为我的编译器告诉我它们< code >未定义。

  • 本文向大家介绍C#留言时间格式化,包括了C#留言时间格式化的使用技巧和注意事项,需要的朋友参考一下 平台:Vs2012 主要实现例如空间发表说说时间的显示,如:某人在10秒前回复了你这种效果,可用在Web浏览器,窗体,等... 计算两个时间差值的函数,返回时间差的绝对值: 以上所述就是本文的全部内容了,希望大家能够喜欢。

  • 我在C#中有一个传递公钥字符串的方法。 我传递的公钥字符串是 我得到一个错误组织。BouncyCastle。安全InvalidKeyException:“不是RSA密钥”。我传递给该方法的公钥格式是否不正确?

  • 本文向大家介绍Objective-C语言NSLog输出格式,包括了Objective-C语言NSLog输出格式的使用技巧和注意事项,需要的朋友参考一下 示例 NSLog在Console.app中查看时,通过调用打印的消息具有以下格式: 日期 时间 程序名称 进程ID 线程ID 信息 2016-07-16 08:58:04.681 test [46259 : 1244773] NSLog messa