我有一个表示十进制#固定精度的超简单的类,而当我想格式化我做这样的事情:怪异行为
assert(d.DENOMINATOR == 1000000);
char buf[100];
sprintf(buf, "%d.%06d", d._value/d.DENOMINATOR, d._value % d.DENOMINATOR);
令人惊讶的是(对我来说至少)这不起作用。即使dDENOMINATOR不能均分d._value,%06d术语也会全部为0。如果我在格式字符串中添加了额外的%d,我会看到第三个地方显示正确的值 - 这就像是在我的两个人之间秘密地创建了一个额外的参数。
如果我计算sprintf调用之外的两个术语,那么所有的表现都是我所期望的。我想用一个更简单的测试用例来重现这一点:
char testa[200];
char testb[200];
int x = 12345, y = 1000;
sprintf(testa, "%d.%03d", x/y, x%y);
int term1 = x/y, term2 = x%y;
sprintf(testb, "%d.%03d", term1, term2);
...但这个工作正常。所以我完全不知道到底发生了什么,未来如何避免它,等等。谁能为我阐明这一点?
(编辑:问题最终是因为d._value和d.DENOMINATOR都是long long,所以%d不足以感谢Serge对此的评论,指出了问题,Mark此后不久提交了答案)
什么是“d”类型的定义 – 2012-01-12 21:37:15
请显示输出示例。此外,d; _value和d.DENOMINATOR的类型是什么? – 2012-01-12 21:37:25
你最好向我们展示这个超级简单的实现。 – 2012-01-12 21:39:17