我正在使用完全基于双精度的应用程序,并且在一个将字符串解析为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,不是吗?
我正在使用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
我试图用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)
谢谢.
我需要测试一个Java程序20次,并需要设置随机种子,以便可以重复测试.如果我将初始种子设置为0,然后在每次运行时增加1(即1,2,3等),这种方法是否仍能确保完全随机性,即使种子不相距很远?
谢谢
我的客户告诉我,我必须为iPhone 4(视网膜显示器)使用不同的图像,而对于其他旧版本则不同
怎么做才能有人帮忙?