Private Sub Populate()
Dim dt1 As New DataTable
Dim dt2 As New DataTable
con.Open()
Dim Cmd1 As New SqlCommand("select * from Itemmaster where flag='G'", con)
dt1.Load(Cmd1.ExecuteReader)
Cmd1.CommandText = "Select * from Itemdetail"
dt2.Load(Cmd1.ExecuteReader)
DataGridView1.AutoGenerateColumns = False
DataGridView1.DataSource = dt1
Dim colpgCombo As New DataGridViewComboBoxColumn()
colpgCombo.DataSource = dt1
colpgCombo.DisplayMember = "Name"
colpgCombo.ValueMember = "code"
colpgCombo.DataPropertyName = "Name"
colpgCombo.HeaderText = "Product Group"
DataGridView1.Columns.Add(colpgCombo)
Dim colpru As New DataGridViewTextBoxColumn()
colpru.DataPropertyName = "Unit"
colpru.HeaderText = "Unit"
DataGridView1.Columns.Add(colpru)
Dim colHsn As New DataGridViewTextBoxColumn()
colHsn.DataPropertyName = "Hsncode"
colHsn.HeaderText = "Hsncode"
DataGridView1.Columns.Add(colHsn)
Dim colRate As New DataGridViewTextBoxColumn()
colRate.DataPropertyName = "Rate"
colRate.HeaderText = "Rate"
DataGridView1.Columns.Add(colRate)
End Sub
Private Sub ButtonNewItem_Click(sender As Object, e As EventArgs) Handles ButtonNewItem.Click
Populate()
End Sub
n^round(log_n(x))
где log_n является логарифмом для базирования n. Вам, вероятно, придется изменить раунд () в зависимости от того, как Вы определяете "самый близкий".
Отметьте это log_n(x)
может быть реализован как:
log_n(x) = log(x) / log(n)
где log
логарифм к любой удобной основе.
Для питания 2 на целых числах, существует умный прием, которые состоят из копирования последнего бита много раз направо. Затем только необходимо увеличить число, и Вы имеете свою власть 2.
int NextPowerOf2(int n)
{
n |= (n >> 16);
n |= (n >> 8);
n |= (n >> 4);
n |= (n >> 2);
n |= (n >> 1);
++n;
return n;
}
Для питания 2 и> = 1 Вы видите, сколько раз Вы можете разрядное право сдвига. В течение каждого раза, когда это - 1 дополнительная мощность 2, Вы устраняете. После того как Вы переходите 0, у Вас есть свое число.
Я думаю, что мог бы приблизиться к проблеме, но использующий журнал базируются 2, и журнал базируются 10.
log10 (123) 2.something. получите слово этого, затем повышают 10 до того питания, и это должно получить Вас близко.
то же самое должно работать с основой журнала 2.
log2 (9) 3.something, получают слово того затем повышение к к тому питанию
Вы могли бы играть с округлением журнала.
Вам, вероятно, придется изменить раунд () в зависимости от того, как Вы определяете "самый близкий".
Ответ Hewgill @Greg корректен кроме него, окружает слишком рано для примеров, которые Вы дали. Например, 10^round (log_10 (3.5)) == 10, не 1. Я предполагаю, что это - то, под чем он подразумевает, 'как Вы определяете "самый близкий"'.
Вероятно, самый простой способ использовать формулу Greg и если это слишком высоко (или слишком низко для x <1), используйте следующее более низкое питание два:
closest = n ^ round(log_n(x))
if (closest > x) {
other = closest / n
} else {
other = closest * n
}
if (abs(other - x) < abs(closest - x)) {
return other
} else {
return closest
}