- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我是looking对于类似 sprintf
的格式字符串,它将格式化具有可变 小数位数但固定 字符总数的 float (例如, 3)、为了提供最大限度的信息。例如:
0 -> `.00` or `0.0` or ` 0`
0.124 -> `.12`
0.357 -> `.36`
1.788 -> `1.8`
9.442 -> `9.4`
10.25 -> `10.` or ` 10`
75.86 -> `76.` or ` 76`
99.44 -> `99.` or ` 99`
100.0 -> `100`
(是的,我的数字都是 0 到 100 的 float )
如何实现?
这种定宽格式化是用sprintf格式化字符串语言实现的吗?
最佳答案
Is this kind of fixed-width formatting implemented in sprintf format string language?
没有。
How to achieve this?
为了满足 OP 的目标,代码可以分析 float f
的范围尝试使用最大信息进行打印。
以 "%.*f"
开头控制 .
之后的位数.
一个常见的陷阱发生在值略低于 10 的幂时,它会四舍五入并导致输出中出现另一个数字。
代码可以尝试针对 f < 0.995f
进行测试而不是 f < 1.0
例如,鉴于浮点的二进制性质,这会导致失败的极端情况。
最好根据 1.0、10.0 等精确常数测试范围
下面最多尝试两次 sprintf()
.第二次尝试使用那些讨厌的值,这些值刚好低于 10 的幂。
#include <assert.h>
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
void iago_sprint1(char *dest, int len, float f) {
if (f < 1.0) {
char buf[len + 2];
//printf("p1\n");
snprintf(buf, sizeof buf, "%.*f", len - 1, f);
if (buf[0] == '0') {
strcpy(dest, buf + 1);
return;
}
}
float limit = 10.0;
int prec = len - 2;
while (prec >= -1) {
if (f < limit) {
char buf[len + 2];
//printf("p2\n");
int cnt = snprintf(buf, sizeof buf, "%.*f", prec < 0 ? 0: prec, f);
if (cnt <= len) {
strcpy(dest, buf);
return;
}
}
prec--;
limit *= 10;
}
assert(0); // `f` was out of range
}
#define N 3
int main(void) {
float f[] = {0, 0.124f, 0.357f, 1.788f, 9.442f, 10.25f, 75.86f, 99.44f,
100.0f, 99.999f, 9.9999f, .99999f, .099999f, 1.04f, 1.06f};
char line[N + 1];
for (unsigned i = 0; i < sizeof f / sizeof *f; i++) {
//snprintf(line, sizeof line, "%#*g", N, f[i]);
//puts(line);
iago_sprint1(line, N, f[i]);
puts(line);
}
}
输出
.00
.12
.36
1.8
9.4
10
76
99
100
100
10
1.0
.10
1.0
1.1
预计算精度需要陷阱
代码是否应该尝试预先计算只有 1 所需的精度 sprintf()
调用,计算需要像 sprintf()
一样推断精度确实 - 实际上代码正在重新执行 sprint()` 工作。
考虑 len==3
和 float x = 9.95f;
.作为二进制 float
并不准确表示,它的值恰好高于或低于 9.951。如果在下方,则字符串应为 "9.9"
,如果在上面,"10."
.如果代码有 double x = 9.95;
(同样不能完全表示)输出可能不同。如果代码使用 float
,但是FLT_EVAL_MODE > 1
,实际传递的值可能不是预期的 float 9.95
.
Precision--> .1 .0
9.94001... "9.9" "10."
9.94999... "9.9" "10." // Is this 9.95f
9.95001... "10.0" "10." // or this?
9.95999... "10.0" "10."
我重新编写并简化了代码 - 在接受之后。
技巧 是用 "%*.f"
打印基于 f
的 10 次方计算的精度到一个缓冲区 比目标宽一个 - 假设由于四舍五入而没有进位到另一个数字。
10 的幂计算可以用一个小循环精确地完成。
当主角是 0
时, 它不需要像 "0.xx"
中那样--> ".xx"
.
否则由于四舍五入而没有进位到另一个数字,字符串适合并且我们完成了。
否则为进位,则最后一个字符为 '.'
或 '0'
小数点后,所以不需要。这发生在 f
时刚好低于 10 的幂,但打印版本四舍五入到 10 的幂。因此只复制长度为 1 的数字。
// `len` number of characters to print
// `len+1` is the size of `dest`
void iago_sprint3(char *dest, int len, float f) {
assert(len >= 1);
int prec = len - 1;
float power10 = 1.0;
while (f >= power10 && prec > 0) {
power10 *= 10;
prec--;
}
char buf[len + 2];
int cnt = snprintf(buf, sizeof buf, "%.*f", prec, f);
assert (cnt >= 0 && cnt <= len + 1);
if (buf[0] == '0') {
strcpy(dest, buf + 1);
return;
}
strncpy(dest, buf, (unsigned) len);
dest[len] = 0;
}
1 典型 float 9.95f
正是
9.94999980926513671875
典型 double 9.95
正是
9.949999999999999289457264239899814128875732421875
关于c - sprintf 格式化 : fixed number of characters, 小数位数可变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53296362/
如何将整数类型转换为 double /浮点类型以显示小数点?例如,如果我想将数字转换为货币格式: 5 会变成 5.004.3 会变成 4.30 javascript 有什么东西可以用来做这种转换吗?
【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://www.cnblogs.com/cnb-yuchen/p/18107586 出自【进步*于辰的博客】
我意识到这是一个重复的问题,但是 this 中提到的解决方案这个问题完全不适合我。 我目前的代码如下 Sub ConvertTextToNumber() Dim Area As Range, C As
我正在使用数学 javascript,但在用它来替换点的逗号和逗号的点时遇到了一些麻烦。我可以改变千位分隔符的逗号,但无法设法将小数点变成逗号。我尝试了其他帖子中的一些建议,但没有感到高兴。目标是实现
我正在尝试在 Android 中创建一个数字选择器,但轮子只增加 1。我想增加 0.1。我在网上查了一下,但我发现了一个格式化的浮点数组禁用了轮子。请帮助并为语法感到抱歉,我正在学习。 最佳答案 您可
我正在尝试在多个网站上获取利率。数据相当非结构化,但形式足够接近。我想要捕捉的内容: x.xx% 至 xx.xx% 数据示例: 由 FDIC 成员 WebBank 发放的所有贷款。您的实际利率取决于信
在 MySQL 表中,我有一个具有不同值的 VARCHAR 列,这些值可能代表字符串、整数、浮点、任意值。这些值作为特定于语言的字符串写入数据库,这意味着 123.45 的浮点值可以写为德语中的 "1
我想编写一个正则表达式,它允许整数或具有 0 - 2 个小数位的小数。 有效输入 1 1. 1.1 1.11 111111111 111111111. 111111111.1 111111111.11
我正在尝试为 nullable 实现客户端验证其小数点分隔符可以是逗号(例如:123,45)。 在我看来: ... @Html.LabelFor(model => model.Turnove
我找不到合适的正则表达式来仅从字符串中提取 float 。考虑以下字符串: $string = "8x2.1 3x2"; 我想提取 2.1,我尝试了以下操作,但这给了我整数和 float : preg
我希望使用正则表达式函数分离以下数据,如下所示: 要使用的功能: let fx=(text,regex)=> Web.Page( " var x='
我是 jquery 新手。我有一个带有两个输入框的表单。我实现了一些验证。 Min.Amount Max.Amount
我正在java中实现一个简单的算法,它接受一个整数数组,并查找并返回数组中相邻整数的最大乘积。 为此,我首先初始化了一个名为largestProduct的变量,我用它来跟踪当前找到的最大(最佳)产品。
在 JavaScript 中,我想定义小数点的位置。我只能在示例中真正展示它。 假设输入值为 1234 。 我希望输出为 123.4 。 或者,如果输入是 12345 ,我希望输出是 123.45 。
我有这段代码,只允许在 keypress() 的输入字段中输入数字 if (e.which != 8 && e.which != 0 && (e.which 57)) { return fa
我目前正在开发一些基于 Django 的 Web 项目,在这个 Web 开发过程中,我遇到了以下我无法正确理解的代码。 if price_product['price'] == Decimal('-1
这个问题在这里已经有了答案: How do I print a double value with full precision using cout? (17 个答案) 关闭 7 年前。 我试图在
这应该是微不足道的,但我正在兜圈子,也许有人可以提供帮助。 我有两个表(T1,T2),我希望从中提取每行中的多个值并更新第三个表(T3)的内容当且仅当)T1 中有两个 UQ,NN 字段,T2 匹配,在
如果数字不是十进制,我需要附加.00,但是当我尝试下面的代码时,它会将整个数字更改为0.00。例如,如果数字是12,200,它会将其更改为0.00,而不是在末尾添加.00 $('.total-amou
我正在尝试在容器 View 中设置 9:16 纵横比 View 。以下代码在 viewDidLayoutSubviews 中设置约束,以便在正确的位置考虑自动布局。它还调用 layoutIfNeede
我是一名优秀的程序员,十分优秀!