我编写了代码来计算两个字符串之间的Levenshtein距离,并给出输出,如浮点格式,小数点后面的数字。
如何格式化输出以在小数点后显示两位数?我不知道如何用Java做到这一点,但我知道在C中我会使用像。%2.f这样的东西。
以下是代码:
package algoritma.LevenshteinDistance;
public class LevenshteinDistance {
String hasilPersen;
public String getHasilPersen() {
return hasilPersen;
}
public void setHasilPersen(String hasilPersen) {
this.hasilPersen = hasilPersen;
}
public LevenshteinDistance() {
}
public double similarity(String s1, String s2) {
if (s1.length() < s2.length()) { // s1 should always be bigger
String swap = s1;
s1 = s2;
s2 = swap;
}
int bigLen = s1.length();
if (bigLen == 0) {
return 1.0; /* both strings are zero length */ }
return (bigLen - computeEditDistance(s1, s2)) / (double) bigLen;
}
public int computeEditDistance(String s1, String s2) {
s1 = s1.toLowerCase();
s2 = s2.toLowerCase();
int[] costs = new int[s2.length() + 1];
for (int i = 0; i <= s1.length(); i++) {
int lastValue = i;
for (int j = 0; j <= s2.length(); j++) {
if (i == 0) {
costs[j] = j;
} else {
if (j > 0) {
int newValue = costs[j - 1];
if (s1.charAt(i - 1) != s2.charAt(j - 1)) {
newValue = Math.min(Math.min(newValue, lastValue),
costs[j]) + 1;
}
costs[j - 1] = lastValue;
lastValue = newValue;
}
}
}
if (i > 0) {
costs[s2.length()] = lastValue;
}
}
return costs[s2.length()];
}
public String printDistance(String s1, String s2) {
System.out.println("[Edit Distance] " + s1 + " and " + s2 + " " +similarity(s1, s2) * 100 + "%");
return similarity(s1, s2) * 100 + " % ";
}
public static void main(String[] args) {
LevenshteinDistance lv = new LevenshteinDistance();
lv.printDistance("841644761164234287878797", "841644487611642341");
}
}
编辑,我的意思是返回方法public double similarity
或方法printDistance
。
因为,在我创建这个类的对象的另一个类中,我需要返回格式为0.00
答案 0 :(得分:1)
以下是几种方式:
double number = 678.675379823;
System.out.printf("%.2f", number);
如果您想将结果保存在String
中 String no = String.format("%.2f", number);
System.out.println("Formatted no :"+no);
java.text.DecimalFormat
是将数字格式化为n个小数位数的简洁明了的方法。
NumberFormat formatter = new DecimalFormat("##.00");
System.out.println(formatter.format(number));
虽然java.text.DecimalFormat
是一个很好的实用程序类,并允许您在Java中动态格式化数字,但它有一个问题,即不是线程安全的或同步的。在时要小心多线程环境正确。
答案 1 :(得分:0)
使用System.out.printf(String formatString, Object... args)
。
System.out.printf("[Edit Distance] %.2f and %.2f %.2f%%%n", s1, s1,
similarity(s1, s2) * 100);
Here's the documentation on format strings
一些相关的摘录(文档很长而且有点令人困惑):
常规,字符和数字类型的格式说明符具有以下语法:
%[argument_index$][flags][width][.precision]conversion
可选的 argument_index 是十进制整数,表示参数列表中参数的位置。第一个参数由“1 $”引用,第二个参数由“2 $”等引用
可选的标志是一组修改输出格式的字符。有效标志集取决于转换。
可选 width 是一个非负十进制整数,表示要写入输出的最小字符数。
可选的精度是一个非负十进制整数,通常用于限制字符数。具体行为取决于转换。
所需的转换是一个字符,指示应如何格式化参数。给定参数的有效转换集取决于参数的数据类型。
答案 2 :(得分:0)
您可以使用以下内容:
public class DecimalPlaces {
public static void main(String[] args) {
double d = 1.234567;
System.out.printf("%1$.2f", d);
}
}
OR
public void GetTwoDecimal(){
double d = 2.34568;
DecimalFormat f = new DecimalFormat("##.00"); // this will helps you to always keeps in two decimal places
System.out.println(f.format(d));
}
答案 3 :(得分:0)
使用:
DecimalFormat df = new DecimalFormat("#.00");
df.format(your_decimal_value)
答案 4 :(得分:0)
可以使用DecimalFormat,我将相似度乘以100后使用它。代码如下,希望它能帮到你。
import java.awt.Graphics;
import java.text.DecimalFormat;
import javax.swing.JFrame;
public class LevenshteinDistance {
String hasilPersen;
public String getHasilPersen() {
return hasilPersen;
}
public void setHasilPersen(String hasilPersen) {
this.hasilPersen = hasilPersen;
}
public LevenshteinDistance() {
}
public double similarity(String s1, String s2) {
if (s1.length() < s2.length()) { // s1 should always be bigger
String swap = s1;
s1 = s2;
s2 = swap;
}
int bigLen = s1.length();
if (bigLen == 0) {
return 1.0; /* both strings are zero length */
}
return (bigLen - computeEditDistance(s1, s2))
/ (double) bigLen;
}
public int computeEditDistance(String s1, String s2) {
s1 = s1.toLowerCase();
s2 = s2.toLowerCase();
int[] costs = new int[s2.length() + 1];
for (int i = 0; i <= s1.length(); i++) {
int lastValue = i;
for (int j = 0; j <= s2.length(); j++) {
if (i == 0) {
costs[j] = j;
} else {
if (j > 0) {
int newValue = costs[j - 1];
if (s1.charAt(i - 1) != s2.charAt(j - 1)) {
newValue = Math.min(Math.min(newValue, lastValue),
costs[j]) + 1;
}
costs[j - 1] = lastValue;
lastValue = newValue;
}
}
}
if (i > 0) {
costs[s2.length()] = lastValue;
}
}
return costs[s2.length()];
}
public String printDistance(String s1, String s2) {
double result = similarity(s1, s2);
double times100 = result * 100;
DecimalFormat decimalFormat = new DecimalFormat("0.00");
Double formattedResult = Double.parseDouble(decimalFormat.format(times100));
System.out.println("[Edit Distance] " + s1 + " and " + s2 + " "
+ formattedResult + "%");
return formattedResult + " % ";
}
public static void main(String[] args) {
LevenshteinDistance lv = new LevenshteinDistance();
lv.printDistance("841644761164234287878797", "841644487611642341");
}
}