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;
}
我有一个 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;
}