long加小数位

Add decimal position to long

我有一个 long 值,我想将它转换为小数 3。

示例值: 324 4353 53463

如果值的长度为 3,则这些数字是小数,例如:324 应为 0.324。

如果有4位以上,最后3位为小数,例如:4353应该是4.353,53463应该是53.463。

执行此操作的最佳方法是什么...我是否应该将其转换为字符串并使用字符串操作将 .还是有更简单的方法来做到这一点(似乎不正确)?

看来你的整个问题可以概括如下:

您有一个 long,您想要将其转换为 double 并除以 1000。

所以,正如人们已经在评论中解释的那样,x / 1000.0 应该这样做。

如果你只想用 . 显示它,而你实际上并没有使用 double,那么将 long 转换为字符串,在前面加上一些零,并在字符串中嵌入 . 字符也应该做得很好,特别是因为这是一个 arduino,可能没有任何国际化问题。 (如果您确实有国际化问题,那么您会想要使用 double,因为您的标准库会使用 ., 或任何正确的方式显示它对于当前的文化。)

该技术称为缩放。只需将数字乘以 10^(小数位数)即可。

例子:小数点后两位:457657856表示4576578.56

4位小数56表示0.0056

x和y被缩放到小数点后n位,w和z代表实数

x + y = w + z

x - y = x - z

(x * y) / 10^n = w * z

(x * 10^n) / y = w / z

从字符串中读取 - 您有 1e10 个关于它的 SO 主题

I have a long value and I would like to convert it to a decimal of 3.

根据这个和 OP 的其他注释,它显示为 字符串 或需要打印出来。

名义上,下面将完成此操作。请注意,d 的值可能仅 接近 0.001 的数学倍数,但不完全是。然而 printf() 将根据需要打印一个舍入值。

long some_long = foo();
double d = some_long / 1000.0;
printf("%.3f\n", d);

但是当 long 中的值位超过 double 的二进制精度时会发生什么?

分两部分打印。处理负值是棘手的:一定要打印符号并使用大部分和较小部分的绝对值并打印前导零。

long some_long = foo();
long most = some_long / 1000;
long least = some_long % 1000;
printf("%s%ld.%03ld\n", "-" + (some_long >= 0), labs(most), labs(least));

[到 wiki - 不是为了积分]

下面是正值和负值的简单解决方案:

#include <limits.h>
#include <stdio.h>

void print_long_3decimals(long value) {
    char buf[CHAR_BIT * sizeof(long) / 3 + 2];
    int len = sprintf(buf, "%04ld", value);
    printf("%*s.%s\n", len - 3, buf, buf + len - 3);
}

这是另一个只转换为具有指定小数位数的字符串的方法:

#include <stdio.h>
#include <string.h>

// assuming dest is sufficiently large
char *convert_long_decimals(char *dest, long value, int decimals) {
    int n = decimals > 0 ? decimals : 0;
    char *p = dest + sprintf(dest, "%0*ld", n + 1, value) - n;
    if (n) {
        memmove(p + 1, p, n + 1);
        *p = '.';
    }
    return dest;
}