今天早上我有一个小型的WTF时刻.WTF可以概括为:
float x = 0.2f;
float y = 0.1f;
float z = x + y;
assert(z == x + y); //This assert is triggered! (Atleast with visual studio 2008)
Run Code Online (Sandbox Code Playgroud)
原因似乎是表达式x + y被提升为double并与之中的截断版本进行比较z.(如果我更改z为double断言未触发).
我可以看到,出于精确原因,在将结果转换为单精度之前,以双精度执行所有浮点算术是有意义的.我在标准中找到了以下段落(我想我已经知道了,但在这种情况下不是这样):
4.6.1.
"类型的右值float可以转换为类型的右值double.值不变"
我的问题是,x + y保证会被提升为双倍,还是由编译人员自行决定?
更新:由于许多人声称不应该使用==浮点数,我只是想说在我正在使用的特定情况下,确切的比较是合理的.
浮点比较是棘手的,这里有一个关于这个主题的有趣链接,我认为还没有提到.
所以我在javascript中添加和减去浮点数,我需要知道如何始终取任何小数超过3位数的数字的上限.例如:
3.19 = 3.19
3.191 = 3.20
3.00000001 = 3.01
我想检查一个结果的方法:
result.should == [1.0,2.0,3.0]
Run Code Online (Sandbox Code Playgroud)
但是我收到一个错误:
expected: [1.0, 2.0, 3.0]
got: [1.0, 2.0, 3.0] (using ==)
Run Code Online (Sandbox Code Playgroud)
我认为四舍五入的问题,但我不知道如何比较它们,例如偏差为0.1.
谢谢你,apneadiving.我写了自己的匹配器,如果它可以帮助某人:
RSpec::Matchers.define :be_closed_array do |expected, truth|
match do |actual|
same = 0
for i in 0..actual.length-1
same +=1 if actual[i].round(truth) == expected[i].round(truth)
end
same == actual.length
end
failure_message_for_should do |actual|
"expected that #{actual} would be close to #{expected}"
end
failure_message_for_should_not do |actual|
"expected that #{actual} would not be close to #{expected}"
end
description do
"be a close to #{expected}"
end
end
Run Code Online (Sandbox Code Playgroud) 我需要格式化(而不是舍入)a double到2位小数.
我尝试过:
String s1 = "10.126";
Double f1 = Double.parseDouble(s1);
DecimalFormat df = new DecimalFormat(".00");
System.out.println("f1"+df.format(f1));
Run Code Online (Sandbox Code Playgroud)
结果:
10.13
Run Code Online (Sandbox Code Playgroud)
但我要求输出 10.12
现在我正在构建一个从电子表格导入数据的小应用程序,由于原始条目的性质,读取的字符串具有8½,2½等值.
例如,我使用简单函数的目标是将2½转换为float 2.5.
我已经尝试过.to_f方法,但这给我留下了一个奇怪的值2.02½.
任何见解或建议将非常感谢!
我在Eclipse工作多年后开始使用Visual Studio(2010).
我不时地发现Eclipse的"Revert"功能非常有用,即从磁盘重新加载文件,丢弃所有更改.(与版本控制还原无关.)
我如何使用Visual Studio执行此操作?应该很简单,但我还没有找到它.
我知道我可以通过"撤消直到*-indicator消失"来做到这一点,但这是非常不切实际的.
我在6到8之间生成10个随机浮点数(完全有理由),并以序列化形式将它们写入mysql数据库.但是在存储时似乎出现了一个怪癖:
在存储之前我只是输出相同的数据来查看它的样子,这就是我得到的结果
a:10:{i:0;d:6.20000000000000017763568394002504646778106689453125;i:1;d:7.5999999999999996447286321199499070644378662109375;i:2;d:6.4000000000000003552713678800500929355621337890625;..}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,我得到的数字很长,比如6.20000000000000017763568394002504646778106689453125而不是我真正想看到的,只有6.2.只有在我序列化数据时才会发生这种情况,如果我只是输出数组,我确实将浮点值设置为一位小数.这是我的代码:
function random_float ($min,$max) {
return ($min+lcg_value()*(abs($max-$min)));
}
$a1 = random_float(6, 8);
$a1 = round($a1, 1);
$a2 = random_float(6, 8);
$a2 = round($a2, 1);
$a3 = random_float(6, 8);
$a3 = round($a3, 1);
...
$array = array($a1, $a2, $a3, $a4, $a5, $a6, $a7, $a8, $a9, $a10);
echo serialize($array);
Run Code Online (Sandbox Code Playgroud) 我目前在容器div中设置了div,如下所示:
<div id="container">
<div id="element"> Element 1 content </div>
<div id="element"> Element 2 content </div>
<div id="element"> Element 3 content </div>
<div id="element"> Element 4 content </div>
</div>
Run Code Online (Sandbox Code Playgroud)
style.css中:
.container {
width:200px;
overflow-x:auto;
overflow-y:hidden;
}
.element {
width:100px;
float:left;
}
Run Code Online (Sandbox Code Playgroud)
这是代码的jsFiddle:http://jsfiddle.net/vZWTc/.
所以,我希望每个元素彼此相邻排列(一行中所有4个),但只有前两个元素可见(容器是200px,每个元素是100px,所以一次只能看到2个) ,用户可以(水平)滚动到第3和第4个元素(因为它们不太重要)
但是,通过此设置,元素3和4将换行到下一行
更新容器类white-space:nowrap没有任何作用.这只会影响文本,而不会影响div.
有任何想法吗?提前致谢!
有一种简单的方法可以在小数点上对齐一列浮点数吗?换句话说,我希望输出像(垂直条'|'仅用于清晰目的)
(format t "~{|~16,5f|~%~}" '(798573.467 434.543543 2.435 34443.5))
Run Code Online (Sandbox Code Playgroud)
是的
| 798573.44000|
| 434.54355|
| 2.43500|
| 34443.50000|
Run Code Online (Sandbox Code Playgroud)
但是使用尾随空格而不是零,如下所示:
| 798573.44 |
| 434.54355|
| 2.435 |
| 34443.5 |
Run Code Online (Sandbox Code Playgroud) 我想在java中截断一个float和一个double值.
以下是我的要求:1.如果我有12.49688f,它应该打印为12.49而不会四舍五入2.如果它是12.456的双倍,它应该打印为12.45而不会四舍五入3.无论如何,如果值是这样的话12.0,应仅打印为12.
条件3应始终牢记在心.它应与截断逻辑并发.