我在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) 如何防止String.format("%.2f", doubleValue);四舍五入(圆半算法)而不是截断它?
例如
doubleValue = 123.459
Run Code Online (Sandbox Code Playgroud)
格式化后,
doubleValue = 123.46
Run Code Online (Sandbox Code Playgroud)
我只想丢弃最后一位数,
123.45
Run Code Online (Sandbox Code Playgroud)
我知道还有其他方法可以做到这一点,我只想知道是否可以使用String.format.
我如何保证.NET应用程序中的浮点计算(比如在C#中)始终产生相同的位精确结果?特别是在使用不同版本的.NET并在不同平台上运行时(x86 vs x86_64).浮点运算的不准确无关紧要.
在Java中我会使用strictfp.在C/C++和其他低级语言中,这个问题基本上是通过访问FPU/SSE控制寄存器来解决的,但这在.NET中可能是不可能的.
即使控制了FPU控制寄存器,.NET的JIT也会在不同平台上生成不同的代码.在这种情况下,像HotSpot这样的东西会更糟糕......
我为什么需要它?我正在考虑编写一个实时策略(RTS)游戏,它在很大程度上依赖于快速浮点数学和锁定步进模拟.基本上我只会通过网络传输用户输入.这也适用于通过存储用户输入来实现重放的其他游戏.
不是一个选择:
有任何想法吗?
假设您在一个数组中有100000000个32位浮点值,并且每个浮点数的值都在0.0到1.0之间.如果你试图将它们全部加起来像这样
result = 0.0;
for (i = 0; i < 100000000; i++) {
result += array[i];
}
Run Code Online (Sandbox Code Playgroud)
你遇到的问题result远远大于1.0.
那么有哪些方法可以更准确地执行求和?
您可以使用Tortoise SVN比较两个修订或文件.还有比较两个目录的方法吗?
我有两个包含源代码的目录.90%的代码是相同的.现在我要在插件中存储相同的代码,因为重复的代码很糟糕.如果有比较两个目录的方法,Tortoise Diff将是完美的.
我怎样才能做到这一点?如果使用Tortoise是不可能的,那么为此目的,您是否还有其他想法/工具?
我目前在容器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.
有任何想法吗?提前致谢!
我想在java中截断一个float和一个double值.
以下是我的要求:1.如果我有12.49688f,它应该打印为12.49而不会四舍五入2.如果它是12.456的双倍,它应该打印为12.45而不会四舍五入3.无论如何,如果值是这样的话12.0,应仅打印为12.
条件3应始终牢记在心.它应与截断逻辑并发.
这是IEEE 754标准问题.我不完全理解它背后的机制.
public class Gray {
public static void main(String[] args){
System.out.println( (float) (2000000000) == (float) (2000000000 + 50));
}
}
Run Code Online (Sandbox Code Playgroud) 我需要将DateTime转换为Unix时间戳.所以我用谷歌搜索它寻找一些示例代码
在我看到的几乎所有结果中,它们都double用作这种函数的返回值,即使在显式使用floor它将其转换为整数时也是如此.Unix时间戳总是整数.那么使用long或者int代替双重问题是什么?
static double ConvertToUnixTimestamp(DateTime date)
{
DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0);
TimeSpan diff = date - origin;
return Math.Floor(diff.TotalSeconds);
}
Run Code Online (Sandbox Code Playgroud) 在C中翻转双(或浮点)符号的最快方法是什么?
我想,直接访问符号位将是最快的方法,并找到以下内容:
double a = 5.0;
*(__int64*)&a |= 0x8000000000000000;
// a = -5.0
float b = 3.0;
*(int*)&b |= 0x80000000;
// b = -3.0
Run Code Online (Sandbox Code Playgroud)
但是,上述内容不适用于负数:
double a = -5.0;
*(__int64*)&a |= 0x8000000000000000;
// a = -5.0
Run Code Online (Sandbox Code Playgroud)