[英]Float (or double) to decimal fixed point integer
我想将浮点数或双精度数转换为C语言中的十进制定点整数。 考虑C语言的规范,我正在寻找最合适(健壮)的解决方案。
例如,问题就在于此:
double d = 15.6;
int i;
...
i = (int)(d * 10.0); /* I am excepting getting 156 in 'i' */
据我所知,该标准的相关元素(使用C99,ISO / IEC 9899:TC3,请参阅此问题进行下载):
_Bool
以外的整数类型时,小数部分将被丢弃(即,该值将被截断为零)。 (......) 示例中的15.6
在IEEE double中没有确切的表示形式,因此我将除d
之外将其略微提高或降低。 问题出在“稍稍低于”部分,那么示例中的i
不会得到例外的结果(而是155
)。
我的明显做法是这样的(仅考虑零或正值):
i = (int)(d * 10.0 + 0.5);
至少如果我正确解释了C标准。 我之所以问是因为,由于“实现定义的”行为,人们可能会遇到一致的结果,而实际上某些其他实现可能会破坏程序,因此反复试验并不是找到适当解决方案的适当方法。
尤其是以下问题与该问题有关,我认为该问题的答案不正确。
C99为此指定了一个舍入函数。 使用它,然后转换为int。
更新:对于C89,您可以尝试
double y = floor(x);
double z = x == y ? x : floor(2.0*x-y);
这应该与C99 round
相同,不同之处在于小数部分等于0.5的负数将向上舍入(如Java),并且零可能会被错误地签名(这是基于Arch Robinson的类似技巧)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.