小编Whi*_*g34的帖子

丢失精度从java BigDecimal转换为double

我正在使用完全基于双精度的应用程序,并且在一个将字符串解析为double的实用程序方法中遇到问题.我找到了一个修复,使用BigDecimal进行转换解决了这个问题,但是当我将BigDecimal转换回double时又引发了另一个问题:我失去了几个精度.例如:

import java.math.BigDecimal;
import java.text.DecimalFormat;

public class test {
    public static void main(String [] args){
        String num = "299792.457999999984";
        BigDecimal val = new BigDecimal(num);
        System.out.println("big decimal: " + val.toString());
        DecimalFormat nf = new DecimalFormat("#.0000000000");
        System.out.println("double: "+val.doubleValue());
        System.out.println("double formatted: "+nf.format(val.doubleValue()));
    }
}
Run Code Online (Sandbox Code Playgroud)

这会产生以下输出:

$ java test
big decimal: 299792.457999999984
double: 299792.458
double formatted: 299792.4580000000
Run Code Online (Sandbox Code Playgroud)

格式化的double表明它在第三位之后失去了精度(应用程序需要较低的精度位置).

如何让BigDecimal保留那些额外的精度位置?

谢谢!


追上这篇文章后更新.有人提到这超出了双数据类型的精度.除非我错误地阅读此引用:http: //java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.2.3 然后double原语的最大指数值为E max = 2 K-1 -1,标准实现K = 11.那么,最大指数应该是511,不是吗?

java floating-point precision double bigdecimal

12
推荐指数
2
解决办法
4万
查看次数

使用Lucene进行精确短语搜索?

我正在使用SpanTerm Query来搜索lucene中的确切短语.但它似乎没有用.这是我的代码.

索引

IndexWriter writer = new IndexWriter(dir, new StandardAnalyzer(Version.LUCENE_30), false,IndexWriter.MaxFieldLength.UNLIMITED);  
doc.add(new Field("contents", sb.toString(), Field.Store.YES, Field.Index.ANALYZED,Field.TermVector.WITH_POSITIONS_OFFSETS));
doc.add(new Field("imageid", imageDocument.getImageId(), Field.Store.YES, Field.Index.NOT_ANALYZED));
doc.add(new Field("title", imageDocument.getTitle(), Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field("country", imageDocument.getCountry(), Field.Store.YES, Field.Index.NOT_ANALYZED));
write.addDocument(doc);
Run Code Online (Sandbox Code Playgroud)

搜索

String sentence = searchParameters.get("searchExactWord");
String[] words = sentence.split(" ");
String queryNoWord = "";
int i = 0;
SpanTermQuery [] clause = new SpanTermQuery[words.length];
for (String word : words)
{
    clause[i] = new SpanTermQuery(new Term("contents",word));
    i++;
}
SpanNearQuery query = new SpanNearQuery(clause, 0, true);
booleanQuery.add(query, BooleanClause.Occur.MUST);
Run Code Online (Sandbox Code Playgroud)

如果我做错了,请指导我???

Prateek

java lucene

10
推荐指数
1
解决办法
3万
查看次数

不可扩展的窗口

在使用JFrame时,是否有可能让用户无法扩展窗口?

java swing jframe resizable

3
推荐指数
2
解决办法
341
查看次数

加密字符串从Delphi到C#

我试图用Delphi Encryption Compendium中的Cipher1 3.0,第一部分解密用Delphi加密的c#中的一个字符串.我使用TCipher_Rijndael.

我加密的字符串是:this-is-a-test-example

密码:通过

加密值为:iKBC8kX4ZEk4A1pCj6jwEegqjpxhqw ==

当我尝试在c#中解密时,我发现错误:要解密的数据长度无效.

有没有人有同样的问题,什么是解决方案?

这是c#中的解密方法:

public static byte[] Decrypt(byte[] cipherData,
                                byte[] Key, byte[] IV)
    {

        MemoryStream ms = new MemoryStream();  
        Rijndael alg = Rijndael.Create();      
        alg.Key = Key;
        alg.IV = IV;
        CryptoStream cs = new CryptoStream(ms,
            alg.CreateDecryptor(), CryptoStreamMode.Write);           
        cs.Write(cipherData, 0, cipherData.Length);    
        cs.Close();
        byte[] decryptedData = ms.ToArray();
        return decryptedData;
    }
Run Code Online (Sandbox Code Playgroud)

这里是Delphi中的加密代码:

with TCipher_Rijndael.Create('pass',  nil) do
      begin
        memo2.lines.add ( CodeString( 'this-is-a-test-example' , paEncode, fmtDEFAULT));
        Free;
      end;
Run Code Online (Sandbox Code Playgroud)

谢谢.

c# delphi encryption aes

3
推荐指数
1
解决办法
2407
查看次数

Java随机种子

我需要测试一个Java程序20次,并需要设置随机种子,以便可以重复测试.如果我将初始种子设置为0,然后在每次运行时增加1(即1,2,3等),这种方法是否仍能确保完全随机性,即使种子不相距很远?

谢谢

java testing random seed prng

3
推荐指数
1
解决办法
5953
查看次数

单独的图像为单独的版本

我的客户告诉我,我必须为iPhone 4(视网膜显示器)使用不同的图像,而对于其他旧版本则不同

怎么做才能有人帮忙?

iphone image ios4

1
推荐指数
1
解决办法
212
查看次数