繁体   English   中英

浮点数(或双精度数)到十进制固定点整数

[英]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,请参阅此问题进行下载):

  • 6.3.1.4 / 1:当实数浮点型的有限值转换为_Bool以外的整数类型时,小数部分将被丢弃(即,该值将被截断为零)。 (......)
  • 6.4.4.2 / 3:(...)对于十进制浮点常量,(...)结果是在实现中选择的最接近的可表示值,或者紧邻最接近的可表示值的较大或较小的可表示值-确定的方式。 (......)

示例中的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM