说我有以下内容:
int i = 23;
float f = 3.14;
if (i == f) // do something
Run Code Online (Sandbox Code Playgroud)
i
将被提升为a float
并将两个float
数字进行比较,但是可以float
代表所有int
值吗?为什么不提倡既int
和float
一个double
?
以下测试代码会产生不需要的输出,即使我使用了宽度参数:
int main(int , char* [])
{
float test = 1234.5f;
float test2 = 14.5f;
printf("ABC %5.1f DEF\n", test);
printf("ABC %5.1f DEF\n", test2);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
产量
ABC 1234.5 DEF
ABC 14.5 DEF
Run Code Online (Sandbox Code Playgroud)
如何实现这样的输出,使用哪种格式字符串?
ABC 1234.5 DEF
ABC 14.5 DEF
Run Code Online (Sandbox Code Playgroud) 在Python 2.7中,repr
a float
返回最接近17位数的最接近的十进制数; 这足够精确,可以唯一地标识每个可能的IEEE浮点值.str
一个float
类似的工作,除了它将结果限制为12位数; 对于大多数用途,这是一个更合理的结果,并使您免受二进制和十进制表示之间的细微差别.
Python 2演示:http://ideone.com/OKJtxv
print str(1.4*1.5)
2.1
print repr(1.4*1.5)
2.0999999999999996
Run Code Online (Sandbox Code Playgroud)
在Python 3.2中它出现str
并repr
返回相同的东西.
Python 3演示:http://ideone.com/oAKRsb
print(str(1.4*1.5))
2.0999999999999996
print(repr(1.4*1.5))
2.0999999999999996
Run Code Online (Sandbox Code Playgroud)
是否存在描述变更的PEP或负责人的其他声明?
[有一些问题,但没有一个答案特别明确,有些问题与当前的C++标准已经过时了].
我的研究表明,这些是用于检查浮点值是否可以转换为整数类型的主要方法T
.
if (f >= std::numeric_limits<T>::min() && f <= std::numeric_limits<T>::max() && f == (T)f))
使用std::fmod
以提取剩余时间和测试平等为0.
使用std::remainder
和测试相等为0.
第一个测试假定定义f
了一个T
实例的强制转换.不是真实std::int64_t
到float
,例如.
使用C++ 11,哪一个最好?有没有更好的办法?
我有一个关于整数和浮点范围的问题:
如果它们都具有相同的4字节大小,为什么它们具有不同的范围?
在Python中,我需要将一堆浮点数转换为十六进制.它需要填零(例如,0x00000010而不是0x10).就像http://gregstoll.dyndns.org/~gregstoll/floattohex/一样.(遗憾的是我无法在我的平台上使用外部库,因此我无法使用该网站上提供的库)
这样做最有效的方法是什么?
简单的问题:从 int(例如 100)转换为双精度数“向上或向下舍入”到下一个双精度数,还是总是舍入到最接近的一个(最小增量)?
例如static_cast<double>(100)
:
如果 d2 < d1 会向哪个方向投射?
额外问题:我可以以某种方式强制处理器使用特殊函数向下或向上“舍入”到双精度吗?据我所知,没有floor<double>
或者ceil<double>
不幸的是。
c++ floating-point rounding static-cast floating-point-conversion
我如何能转换float
值char*
的C
语言?
如何将浮点数转换为字节序列,以便它可以保存在文件中?这种算法必须快速且高度便携.它必须允许相反的操作,反序列化.如果每个值(持久空间)只需要非常微小的多余位,那就太好了.
我想显示一个包含整个整数部分的浮点数和小数部分最多两位小数,不带尾随零.
http://play.golang.org/p/mAdQl6erWX:
// Desired output:
// "1.9"
// "10.9"
// "100.9"
fmt.Println("2g:")
fmt.Println(fmt.Sprintf("%.2g", 1.900)) // outputs "1.9"
fmt.Println(fmt.Sprintf("%.2g", 10.900)) // outputs "11"
fmt.Println(fmt.Sprintf("%.2g", 100.900)) // outputs "1e+02"
fmt.Println("\n2f:")
fmt.Println(fmt.Sprintf("%.2f", 1.900)) // outputs "1.90"
fmt.Println(fmt.Sprintf("%.2f", 10.900)) // outputs "10.90"
fmt.Println(fmt.Sprintf("%.2f", 100.900)) // outputs "100.90"
Run Code Online (Sandbox Code Playgroud)
格式化具有2g
当整数增加数量级时开始舍入的问题.此外,它有时会显示数字e
.
格式化2f
有问题,它将显示尾随零.我可以写一个删除尾随零的后处理函数,但我宁愿这样做Sprintf
.
这可以通过一般方式使用Sprintf
吗?
如果没有,有什么好办法呢?
c ×4
c++ ×3
python ×2
python-2.7 ×2
c++11 ×1
go ×1
int ×1
integer ×1
promotions ×1
python-3.x ×1
rounding ×1
static-cast ×1
types ×1