我在Python中有一个浮点列表,当我将它转换为字符串时,我得到了下面的内容
[1883.95, 1878.3299999999999, 1869.4300000000001, 1863.4000000000001]
Run Code Online (Sandbox Code Playgroud)
我创建它们时,这些浮点数在小数点后面有2位数(我相信如此),
然后我用了
str(mylist)
Run Code Online (Sandbox Code Playgroud)
如何获得小数点后2位数的字符串?
======================
让我更具体一点:
我希望得到类似"[1883.95,1878.33,1869.43,1863.40]"的内容
之后我需要进行一些字符串操作.例如+ ="!\ t!"
我希望最终结果是一个字符串,我想保留分隔符.
当然我们都知道如何在一个循环中完成它,但希望有人可以提出一个非常聪明和优雅的方式.
受@senshin的启发,以下代码可以作为例子,但我认为还有更好的方法
msg = "["
for x in mylist:
msg += '{:.2f}'.format(x)+','
msg = msg[0:len(msg)-1]
msg+="]"
print msg
Run Code Online (Sandbox Code Playgroud)
谢谢!
python formatting list floating-point-precision floating-point-conversion
所以我一直试图围绕浮点数中有效数字的数量与精度的相对损失之间的关系进行包装,但我似乎无法理解它.我之前正在阅读一篇文章说要做以下事情:
那么为什么这个128有10位有效数字?我理解如何存储浮点数(符号为1位,指数为8位,尾数为23位)并且如果假设所有整数将自动在浮点数据结构中找到确切的住宅,则了解如何丢失精度,但我不知道了解128来自哪里.我的直觉告诉我,我走在正确的轨道上,但我希望有人能够为我清除这一点.
我最初认为可能的浮点数之间的距离是2 ^(n-1),其中n是有效数字的数量,但这并不成立.
谢谢!
可能重复:
在C++中浮动到二进制
我有一个非常小的双变量,当我打印它时我得到-0.(使用C++).现在为了获得更好的精度,我尝试使用
cout.precision(18); \\i think 18 is the max precision i can get.
cout.setf(ios::fixed,ios::floatfield);
cout<<var;\\var is a double.
Run Code Online (Sandbox Code Playgroud)
但它只写-0.00000000000 ...
我想看看var的确切二进制表示.
换句话说,我想看看在这个var的堆栈存储器/寄存器中写入了什么二进制数.
这是我写的代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
double num;
int tmp;
printf("enter a number!\n");
scanf("%lf",&num);
tmp=num*10000;
printf(" temp=%d\n",tmp);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我输入数字1441.1441时,我得到的结果是14411440而不是14411441,这显然是将我的输入数字乘以10000后的正确结果.有人可以帮我解决这个问题吗?
是否存在这两种方法在给定相同输入的情况下返回不同值的情况?
int compare1(float a, float b)
{
return Double.compare(a, b);
}
int compare2(float a, float b)
{
return Float.compare(a, b);
}
Run Code Online (Sandbox Code Playgroud)
出于同样的原因,在java的Float中存储的任何数字都可以存储在java的Double中而不会丢失任何精度,这是真的(或错误的)吗?
谢谢
昨天我问一个问题,为什么我是在一个浮点运算精度损失.我收到一个关于如何在x87寄存器中保存中间结果的答案.这很有帮助,但有些细节仍在逃避.这是我在上一个问题中提出的程序的变体,我在调试模式下使用VC++ 2010 Express.
int main()
{
double x = 1.8939201459282359e-308; /* subnormal number */
double tiny = 4.9406564584124654e-324; /* smallest IEEE double */
double scale = 1.6;
double temp = scale*tiny;
printf("%23.16e\n", x + temp);
printf("%23.16e\n", x + scale*tiny);
}
Run Code Online (Sandbox Code Playgroud)
这输出
1.8939201459282369e-308
1.8939201459282364e-308
Run Code Online (Sandbox Code Playgroud)
根据IEEE标准,第一个值是正确的.赋予scale变量值2.0可为两种计算提供正确的值.据我所知,temp在第一次计算中是一个次正规值,因此失去了精度.我也理解,值scale*tiny保存在x87寄存器中,该寄存器具有更大的指数范围,因此该值具有更高的精度temp.我不明白的是,在添加值时,x我们从较低的精度值中得到正确的答案.当然,如果较低的精度值可以给出正确的答案,那么更高的精度值也应该给出正确的答案吗?这与"双舍入"有关吗?
在此先感谢,这对我来说是一个全新的主题,所以我有点挣扎.
c floating-point floating-accuracy ieee-754 floating-point-precision
我有一个变量类型float.I想要打印到3精度的十进制,包括尾随零.
示例:
2.5 >> 2.500
1.2 >> 1.200
1.3782 >> 1.378
2 >> 2.000
我正在尝试使用它
DecimalFormat _numberFormat= new DecimalFormat("#0.000");
Float.parseFloat(_numberFormat.format(2.5))
Run Code Online (Sandbox Code Playgroud)
但它没有转换2.5 >> 2.500.
难道我做错了什么..
请帮忙..
在我关于32 位十进制数字浮点/双精度分析的问题中,一个答案说要查看__float128.
我使用了它,编译器可以找到它,但是我无法打印它,因为编译器找不到 header quadmath.h。
所以我的问题是:
__float128 是标准的,对吗?quadmath.h标准的吗?这些答案没有帮助:
这 裁判也没有帮助。
请注意,我不想使用任何非标准库。
[编辑]
如果该问题有答案,即使答案是否定的,也会很有用。
我在寻找亚马逊的面试问题时想到了这个问题.
给定一个数字,如何在一系列浮点数据中找到最接近的数字?
如果一切都是整数,则answer减去数组中每个数字的数字,然后在数组中查找具有最小绝对值的元素.
但是当谈到浮点时,它应该是高度非暴力的.
阿尼的想法?谢谢.
假设我们有一个跟踪总和的基本移动平均函数.例如:
Queue values;
double sum;
double CalcSMA(double next) {
values.push(next);
sum -= values.pop();
sum += next;
return sum / SMA_LENGTH;
}
Run Code Online (Sandbox Code Playgroud)
如果我们的窗口是5宽,我们用它来做的话就是这样可以解决的一个例子:
2, 2, 2, 2, 2, 2, 2, 1E100, 2, 2, 2, 2, 2, 2, 2, 2.那么输出就是2, 2, 2, 2E99, 2E99, 2E99, 2E99, 2E99, 0, 0, 0.
即使总和并不是那么显着,但仍然可能有一些非常合理的例子,精确度的微小损失可能会使人为增加一小部分.在很长一段时间内,这可能会加起来并成为一个问题.
有没有人有任何关于如何解决精度损失的想法?
编辑:请注意,此功能旨在工作O(1).这是必要的.因此,每次重新计算都不起作用:窗口太大.