我意识到一个十进制数只能在二进制系统中如此精确地存储为浮点数,但我不明白的是在我的输出10/7的小数点后7位发生了什么.
在我的第一次输出测试中,我注意到浮动结束时的5(第7位)和4(第7位),然后是双精度中的2.我认为浮动中的第7位将是4,因为双排位的第8位是2.
Float 1.4285715 Double 1.4285714285714286
然后我使用float格式将下一个输出测试运行到17个位置.每个中的第8个位置是不同的 - 浮点数是6,这就是为什么第7个位置舍入为5我假设.
Float 1.428571462631225600 Double 1.428571428571428600
在第三个输出测试中,我尝试使用字符串格式进行直接转换,以查看会发生什么.我得到了与第二次测试相同的结果.
如果我对复杂的浮点存储方法有一个简单的问题 - 我很抱歉.
float f = 10/7f;
double d = 10/7d;
System.out.format
("Float %1s\nDouble %2s\n", f,d);
/*
* Float 1.4285715
Double 1.4285714285714286
*/
System.out.format
("Float %1$.17f\nDouble %2$.17f\n", f,d);
/*
* Float 1.428571462631225600
Double 1.428571428571428600
*/
System.out.format
("Float %1s\nDouble %2s\n", (double)f,d);
/*
* Float 1.4285714626312256
Double 1.4285714285714286
*/
Run Code Online (Sandbox Code Playgroud) my $num = log(1_000_000) / log(10);
print "num: $num\n";
print "int(num): " . int($num) . "\n";
print "sprintf(num): " . sprintf("%0.16f", $num) . "\n";
Run Code Online (Sandbox Code Playgroud)
生产:
num: 6
int(num): 5
sprintf(num): 5.9999999999999991
Run Code Online (Sandbox Code Playgroud)
perl 打印浮点数的精度是多少?
使用:v5.8.8为x86_64-linux-thread-multi构建
当我使用(int)和(double)一些时,它无法正常工作.
看看PHP代码示例:
我需要离开2个小数并删除其他...
我知道number_format(); 功能但我不能使用它.因为它是舍入数
number_format(24.299,2);
输出:24.30
我需要:24.29
<?php
$str="158.2";
echo (double)$str; // Output: 158.2
echo (double)$str*100; // Output: 15820
echo (int)((double)$str*100); // Output: 15819 <-WHY? It Must To Be 15820, Why 15819?
echo ((int)((double)$str*100)/100); // Output: 158.19
?>
Run Code Online (Sandbox Code Playgroud)
我需要在数字中留下两位小数,并在不进行舍入的情况下剪切其他小数.
这个问题类似于有关其他语言(例如此处)浮点错误的问题,但我没有找到令人满意的解决方案.
我正在开展一个涉及调查具有某些特征的矩阵的项目.作为其中的一部分,我需要知道列表中有多少矩阵是唯一的.
D <- as.matrix(read.table("datasource",...))
mat_list <- vector('list',length=length(samples_list))
mat_list <- lapply(1:length(samples_list),function(i) matrix(data=0,nrow(D),ncol(D)))
Run Code Online (Sandbox Code Playgroud)
然后,该列表由基于元素的数据的计算填充samples_list.在mat_list填充之后,我需要删除重复项.运行
mat_list <- unique(mat_list)
Run Code Online (Sandbox Code Playgroud)
把事情缩小了很多; 但是,其中许多元素实际上都是彼此的机器错误.该函数unique不允许指定精度,我无法找到修改的源代码.
我有一个想法是:
ErrorReduction<-function(mat_list, tol=2){
len <- length(mat_list)
diff <- mat_list[[i]]-mat_list[[i+1]]
for(i in 1:len-1){
if(norm(diff,"i")<tol){
mat_list[[i+1]] <- mat_list[i]
}
}
mat_list<-unique(mat_list)
return(mat_list)
}
Run Code Online (Sandbox Code Playgroud)
但这只关注成对差异.使用嵌套for循环执行此操作很简单但很可能效率低下.
您知道哪些方法或者您有什么想法来处理识别和删除机器错误中重复的矩阵的问题?
我很难理解float(p)PostgreSQL中的精度参数p .例如,float(1)并且float(24)似乎是完全一样的我.
有谁可以向我提供一些他们的差异的例子,好吗?
postgresql floating-point precision sqldatatypes floating-point-precision
我有以下代码来查找四分位数:
#include <stdio.h>
#include <stdlib.h>
typedef struct {
double qrt[3];
double *value;
int count;
} t_data;
static void set_qrt(t_data *data, int qrt)
{
int n, e;
double d;
d = qrt * 0.25 * data->count + 0.5;
n = (int)d;
e = n != d;
data->qrt[qrt - 1] = data->value[n - 1];
if (e) {
data->qrt[qrt - 1] += data->value[n];
data->qrt[qrt - 1] *= 0.5;
}
}
static void set_qrts(t_data *data)
{
set_qrt(data, 2);
if (data->count > 1) {
set_qrt(data, …Run Code Online (Sandbox Code Playgroud) 码:
class Main {
public static void main (String[] args) {
System.out.print("float: ");
System.out.println(1.35f-0.00026f);
System.out.print("double: ");
System.out.println(1.35-0.00026);
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
float: 1.34974
double: 1.3497400000000002
Run Code Online (Sandbox Code Playgroud)
??? 浮点数得到了正确的答案,但双重是从无处添加额外的东西,为什么?
是不是应该比浮动更精确?
java floating-accuracy double-precision floating-point-precision
任何人都可以向我解释这里发生了什么:
using System;
using System.Text;
namespace ConsoleApplication1 {
class Program {
static void Main(string[] args) {
object o = 1000000.123f;
float f= Convert.ToSingle(o);
double d = Convert.ToDouble(f);
Console.WriteLine(f.ToString("r"));
Console.WriteLine(d.ToString("r"));
Console.ReadLine();
}
}
}
Run Code Online (Sandbox Code Playgroud)
哪个输出:
1000000.13
1000000.125
我期望:
具有底层浮点类型的对象o(似乎发生[从观察它被键入为对象{float}的监视窗口)
1000000.123f将以f存储为1000000.125(IEEE754近似为32位?)
双倍也将存储1000000.125(即使f似乎不包含我的预期,似乎也会发生)
要求在ToString上使用往返格式会在两种情况下都返回1000000.125.
如果有人告诉我,当排出f时,得到1000000.13时我做错了什么?
.net c# floating-point floating-point-precision floating-point-conversion
在我的项目中,我一直在使用Linq's Sum()很多东西.它由MySQL上的NHibernate提供支持.在我的Session Factory我已经明确要求NHibernate的处理正好是8位小数,当涉及到decimals:
public class DecimalsConvention : IPropertyConvention
{
public void Apply(IPropertyInstance instance)
{
if (instance.Type.GetUnderlyingSystemType() == typeof(decimal))
{
instance.Scale(8);
instance.Precision(20);
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我发现将.Sum()小数点后5位的数字四舍五入:
var opasSum = opasForThisIp.Sum(x => x.Amount); // Amount is a decimal
在上面的语句中opaSum等于2.46914,而它应该是2.46913578(直接在MySQL上计算).opasForThisIp是类型的IQueryable<OutgoingPaymentAssembly>.
我需要所有Linq计算来处理8个小数位decimals.
有关如何解决此问题的任何想法?
编辑1:我发现var opasSum = Enumerable.Sum(opasForThisIp, opa => opa.Amount);产生了正确的结果,但问题仍然存在,为什么.Sum()要对结果进行舍入以及如何修复它?
编辑2:生成的SQL似乎有问题:
select cast(sum(outgoingpa0_.Amount) as DECIMAL(19,5)) as col_0_0_
from …Run Code Online (Sandbox Code Playgroud) 在R软件中
a <- 123456789123456789123456789
sprintf("%27f",a)
#[1] "123456789123456791337762816.000000"
Run Code Online (Sandbox Code Playgroud)
我得到了错误的答案.我想要确切的a价值.
为什么系统显示错误的值a?